2011-05-16 69 views
42

如果我做findall(r'regex(with)capturing.goes.here'),如何訪問捕獲的組? 我知道我可以通過finditer來完成,但我不想迭代。用findall捕獲組?

回答

39

findall剛剛返回拍攝組:

>>> re.findall('abc(de)fg(123)', 'abcdefg123 and again abcdefg123') 
[('de', '123'), ('de', '123')] 

相關文檔摘錄:

返回字符串中 模式的所有非重疊匹配項,作爲 字符串的列表。掃描字符串 從左到右依次爲 ,找到的順序返回。如果 模式中有一個或多個組存在,則返回組列表;如果 模式具有多個組,則此 將成爲元組列表。空 匹配包含在結果 中,除非它們觸及另一個匹配的起始 。

15

自由使用組。本場比賽將返回爲組元組的列表:

>>> re.findall('(1(23))45', '12345') 
[('123', '23')] 

如果你想在全場比賽被收錄,只是封裝一組在整個正則表達式:

>>> re.findall('(1(23)45)', '12345') 
[('12345', '23')] 
1

幾種方法是可行的:

>>> import re 
>>> r = re.compile(r"'(\d+)'") 
>>> result = r.findall("'1', '2', '345'") 
>>> result 
['1', '2', '345'] 
>>> result[0] 
'1' 
>>> for item in result: 
...  print(item) 
... 
1 
2 
345 
>>> 
+1

我覺得他問內的正則表達式組爲「(1組)。(第2組)」 – bluepnume 2011-05-16 13:55:35

+0

@bluepnume:也許吧,但他的問題並不清楚。他的例子只有一個捕獲組。 – 2011-05-16 13:57:39

0
import re 
string = 'Perotto, Pier Giorgio' 
names = re.findall(r''' 
       (?P<first>[-\w ]+),\s #first name 
       (?P<last> [-\w ]+) #last name 
       ''',string, re.X|re.M) 

print(names) 

回報

[('Perotto', 'Pier Giorgio')] 

re.M纔有意義,如果你的字符串是多。還需要在正則VERBOSE(等於re.X)模式,我已經寫了,因爲它是用'''