有沒有辦法在Python中動態更新正則表達式組的名稱?在Python中動態命名組正則表達式
例如,如果文字是:
person 1: name1
person 2: name2
person 3: name3
...
person N: nameN
你會如何命名組 'PERSON1', 'PERSON2', 'Person3可能',...,和 'personN' 不知道提前多少人有?
有沒有辦法在Python中動態更新正則表達式組的名稱?在Python中動態命名組正則表達式
例如,如果文字是:
person 1: name1
person 2: name2
person 3: name3
...
person N: nameN
你會如何命名組 'PERSON1', 'PERSON2', 'Person3可能',...,和 'personN' 不知道提前多少人有?
沒有,但你可以做這樣的事情:
>>> 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
參考
請給你的答案添加一個解釋 - 這個正則表達式的作用是什麼? – 2016-11-09 06:21:33
命名捕捉組和編號組(\ 1,\ 2,等)不能是動態的,但你可以實現與的findall同樣的事情:
re.findall(pattern, string[, flags])
返回所有非重疊模式的匹配在字符串,作爲 字符串的列表。掃描字符串 從左到右依次爲 ,找到的順序返回。如果 模式中有一個或多個組存在,則返回組列表;如果 模式具有多個組,則此 將成爲元組列表。空 匹配包含在結果 中,除非它們觸及另一個匹配的起始 。
Python中的正則表達式(我相當肯定這對一般的正則表達式是正確的)不允許任意數量的匹配。您可以捕捉整個重複比賽(通過在重複組周圍放置括號)或捕捉一系列比賽中的最後一場比賽(通過重複捕獲組)。這與這些是命名還是編號捕獲組無關。
您需要通過編程方式遍歷字符串中的所有比賽要做到這一點,像
for match in re.findall(pattern, string):
do_something(match)
從你接受的答案來看,沒有必要對正則表達式
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']]
你真的想從你的示例文本中找到什麼? – ghostdog74 2010-01-07 08:33:09
我試圖在某些日誌文件中查找人員的姓名,這些日誌文件還包含我正在解析的其他信息(日期,ID等)。我試圖在一個正則表達式中完成所有操作,並最終形成一個鍵/值對的字典。 – kliao 2010-01-07 08:42:39