2012-09-26 82 views
2

我有一堆這種形式的數據python正則表達式的簡單幫助 - 處理括號

xxx(xx.xx) - 數字的位數不固定。像

312(21.1) 378(25.5) 374(25.3) 157(10.6) 260(17.6) 1481(100) 
125(28.1) 91(20.4) 94(21.1) 52(11.7) 83(18.7) 445(100) 
50(28.4) 44(25) 29(16.5) 12(6.8) 41(23.3) 176(100) 

請注意,它們都是unicode字符串。可以說留給括號的數字是A,而括號中的數字是B.所以A(B)。

我想要做的是創建一個返回列表[A,B]的函數。

我知道他們可以用RegEx來完成,但我並不擅長他們。無論如何,我做了一些搜索和隨後的教程,所以我想出了:

re.search('\(.*?\)',s) # for B 
re.search('.?\(',s) # for A 

問題是,他們返回與數字括號。像

>>s 
u'312(21.1)' 
>>m=re.search('\(.*?\)',s) 
>>m.group() 
(21.1) 

任何幫助,將不勝感激......

回答

2

使用轉義括號定義組:

>>> [g[:2] for g in re.findall(r'([0-9]+)\(([0-9]+|[0-9]+\.[0-9]+)\)', s)] 
[('312', '21.1'), ('378', '25.5'), ('374', '25.3'), ('157', '10.6'), 
('260', '17.6'), ('125', '28.1'), ('91', '20.4'), ('94', '21.1'), 
('52', '11.7'), ('83', '18.7'), ('50', '28.4'), ('29', '16.5'), ('12', '6.8'), 
('41', '23.3'), ('176', '100')] 
0
import re 
import sys 

li = [] 
while True: 
    line = sys.stdin.readline() 
    if not line: break 
    for i in line.split(): 
    m = re.search('(.*)\((.*)\)', i) 
    tup = (m.group(1), m.group(2)) 
    li.append(tup) 

print li 

輸出樣本:

$ python y 
312(21.1) 378(25.5) 374(25.3) 157(10.6) 260(17.6) 1481(100) 
[('312', '21.1'), ('378', '25.5'), ('374', '25.3'), ('157', '10.6'), ('260', '17.6'), ('1481', '100')] 
+0

-1:你顯然沒有在所有進行測試。 –

+0

其實我只是在發佈前測試它 - 這裏是從我的shell窗口粘貼輸出: 馬克 - Cohens的iMac%蟒蛇Ÿ 312(21.1) 312 21.1 工作正常,我關於Python 2.7.3。你爲什麼說我沒有測試它? –

+0

你的輸入文件在一行中包含多對數字(如在問題中)? –

1

我想這應該更好地幫助:

m = re.findall('([0-9]+\.[0-9]+|[0-9]+)', s) 

我所做的是使用了字符串中的小數點。我查找一個正則表達式,它有一個或多個0-9範圍內的數字,然後是一個小數點,然後是0-9範圍內的一個或多個數字,還會檢查數字爲0-9的字符串作爲替代。然後它將匹配的表達式分組。

您的解決方案提供了括號,因爲您要求正則表達式匹配字符串中的括號。

這將返回兩個數字作爲存儲在m中的python列表。

希望它能解決您的問題。 :)

+0

這不符合括號前面的數字,也不匹配括號內的所有數字。 –

+0

我在發佈之前在python終端上試過了,它對我來說工作正常。它返回括號內的浮點值,這是提問者遇到的問題。你能否詳細說明這個問題? – varagrawal

+0

圓括號中的所有值都不是浮點數。 –

1

或者,您可以只使用字符串操作,在許多情況下,它比RE更簡單,更快。

>>> s = "312(21.1) 378(25.5) 374(25.3) 157(10.6) 260(17.6) 1481(100) 125(28.1) 91(20.4) 94(21.1) 52(11.7) 83(18.7) 445(100) 50(28.4) 44(25) 29(16.5) 12(6.8) 41(23.3) 176(100)" 

分割其爲標記

>>> tokens = s.split() 
>>> tokens 
['312(21.1)', '378(25.5)', '374(25.3)', '157(10.6)', '260(17.6)', '1481(100)', '125(28.1)', '91(20.4)', '94(21.1)', '52(11.7)', '83(18.7)', '445(100)', '50(28.4)', '44(25)', '29(16.5)', '12(6.8)', '41(23.3)', '176(100)'] 

到底 ')'

>>> intermediary1 = [ entry[:-1] for entry in tokens ] 
>>> intermediary1 
['312(21.1', '378(25.5', '374(25.3', '157(10.6', '260(17.6', '1481(100', '125(28.1', '91(20.4', '94(21.1', '52(11.7', '83(18.7', '445(100', '50(28.4', '44(25', '29(16.5', '12(6.8', '41(23.3', '176(100'] 

場所移除成2個字符串

>>> intermediary2 = [ entry.split('(') for entry in intermediary1 ] 
>>> intermediary2 
[['312', '21.1'], ['378', '25.5'], ['374', '25.3'], ['157', '10.6'], ['260', '17.6'], ['1481', '100'], ['125', '28.1'], ['91', '20.4'], ['94', '21.1'], ['52', '11.7'], ['83', '18.7'], ['445', '100'], ['50', '28.4'], ['44', '25'], ['29', '16.5'], ['12', '6.8'], ['41', '23.3'], ['176', '100']] 

轉換爲數字(整數,浮動)

>>> numbers = [ (int(num1), float(num2)) for num1, num2 in intermediary2 ] 
>>> numbers 
[(312, 21.1), (378, 25.5), (374, 25.3), (157, 10.6), (260, 17.6), (1481, 100.0), (125, 28.1), (91, 20.4), (94, 21.1), (52, 11.7), (83, 18.7), (445, 100.0), (50, 28.4), (44, 25.0), (29, 16.5), (12, 6.8), (41, 23.3), (176, 100.0)] 

或使用列表中理解更短的方式:

>>> tokens = [ entry[:-1].split('(') for entry in s.split()] 
>>> numbers = [ (int(num1), float(num2)) for num1, num2 in tokens ] 
>>> numbers 
[(312, 21.1), (378, 25.5), (374, 25.3), (157, 10.6), (260, 17.6), (1481, 100.0), (125, 28.1), (91, 20.4), (94, 21.1), (52, 11.7), (83, 18.7), (445, 100.0), (50, 28.4), (44, 25.0), (29, 16.5), (12, 6.8), (41, 23.3), (176, 100.0)]