2010-01-07 38 views
1

有沒有辦法在Python中動態更新正則表達式組的名稱?在Python中動態命名組正則表達式

例如,如果文字是:

person 1: name1 
person 2: name2 
person 3: name3 
... 
person N: nameN 

你會如何命名組 'PERSON1', 'PERSON2', 'Person3可能',...,和 'personN' 不知道提前多少人有?

+0

你真的想從你的示例文本中找到什麼? – ghostdog74 2010-01-07 08:33:09

+0

我試圖在某些日誌文件中查找人員的姓名,這些日誌文件還包含我正在解析的其他信息(日期,ID等)。我試圖在一個正則表達式中完成所有操作,並最終形成一個鍵/值對的字典。 – kliao 2010-01-07 08:42:39

回答

1

沒有,但你可以做這樣的事情:

>>> import re 
>>> p = re.compile('(?m)^(.*?)\\s*:\\s*(.*)$') 
>>> text = '''person 1: name1 
person 2: name2 
person 3: name3 
... 
person N: nameN''' 
>>> p.findall(text) 

輸出:

[('person 1', 'name1'), ('person 2', 'name2'), ('person 3', 'name3'), ('person N', 'nameN')] 

一個快速的解釋:

(?m)  # enable multi-line mode 
^  # match the start of a new line 
(.*?) # un-greedily match zero or more chars and store it in match group 1 
\s*:\s* # match a colon possibly surrounded by space chars 
(.*)  # match the rest of the line and store it in match group 2 
$  # match the end of the line 

參考

+0

請給你的答案添加一個解釋 - 這個正則表達式的作用是什麼? – 2016-11-09 06:21:33

1

命名捕捉組和編號組(\ 1,\ 2,等)不能是動態的,但你可以實現與的findall同樣的事情:

re.findall(pattern, string[, flags])

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

0

Python中的正則表達式(我相當肯定這對一般的正則表達式是正確的)不允許任意數量的匹配。您可以捕捉整個重複比賽(通過在重複組周圍放置括號)或捕捉一系列比賽中的最後一場比賽(通過重複捕獲組)。這與這些是命名還是編號捕獲組無關。

您需要通過編程方式遍歷字符串中的所有比賽要做到這一點,像

for match in re.findall(pattern, string): 
    do_something(match) 
0

從你接受的答案來看,沒有必要對正則表達式

p=""" 
person 1: name1 
person 2: name2 
person 3: name3 
person N: nameN 
""" 

ARR=[] 
for item in p.split("\n"): 
    if item: 
     s=item.split(":") 
     ARR.append(s) 
print ARR 

輸出

$ ./python.py 
[['person 1', ' name1'], ['person 2', ' name2'], ['person 3', ' name3'], ['person N', ' nameN']]