2012-10-11 55 views
2

我想與蟒解析一個簡單的字符串作爲 -Python的解析內部括號整數字符串中的

Limits paramA : (7, 45) paramB : (0, 0) paramC : (1, 23)

我想在不同的整數,以提取7,45,0,0,1,23。 有人能告訴我如何提取這個?

論壇中有很多字符串解析問題,但我無法找到最適合我的答案。

謝謝。

+0

像「'Limits param1:(7,45)param2:(0,0)''這樣的字符串的期望輸出是什麼? –

回答

6

使用regex

In [71]: import re 

In [72]: strs="Limits paramA : (7, 45) paramB : (0, 0) paramC : (1, 23)" 

In [74]: [int(digit) for digit in re.findall(r'\d+',strs)] 
Out[74]: [7, 45, 0, 0, 1, 23] 
+0

爲什麼使用'{1,}'而不是'+'? –

+0

當我輸入一些非常相似的東西時(雖然我使用列表理解將它們轉換爲整數而不是地圖),您也擊敗了我。 – TimothyAWiseman

+0

刪除括號,'r'\ d +''很好。 – kwatford

2

如果你只是想在字符串中的所有數字:

>>> import re 
>>> s = 'Limits paramA : (7, 45) paramB : (0, 0) paramC : (1, 23)' 
>>> [int(n) for n in re.findall(r'\d+', s)] 
[7, 45, 0, 0, 1, 23] 

如果你只是想找到(同樣的結果在這種情況下)括號內的數字:

>>> [int(n) for m in re.findall(r'\(([\d, ]+)\)', s) for n in m.split(',')] 
[7, 45, 0, 0, 1, 23] 

下面是一個這種差異可能很重要的例子:

>>> s = 'Limits param1 : (7, 45) param2 : (0, 0) param3 : (1, 23)' 
>>> [int(n) for n in re.findall(r'\d+', s)] 
[1, 7, 45, 2, 0, 0, 3, 1, 23] 
>>> [int(n) for m in re.findall(r'\(([\d, ]+)\)', s) for n in m.split(',')] 
[7, 45, 0, 0, 1, 23] 

需要注意的是第一種方法也與從param112param2

2
>>> import re 
>>> import ast 

>>> nums = [num for tup in [ast.literal_eval(tup) for tup in re.findall('\([^)]*\)', s)] for num in tup] 
[7, 45, 0, 0, 1, 23] 

括號內只提取號碼。

+2

使用'ast.literal_eval()'而不是'eval()',這樣更安全。 –

+0

感謝您的建議,我解決了我的答案。 – Lanaru