有没有办法在 Python 中动态更新正则表达式组的名称?
例如,如果文本是:
person 1: name1
person 2: name2
person 3: name3
...
person N: nameN
在事先不知道有多少人的情况下,如何命名组“person1”、“person2”、“person3”、...和“personN”?
有没有办法在 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
参考
命名捕获组和编号组(\1、\2 等)不能是动态的,但您可以使用 findall 实现相同的目的:
返回字符串中模式的所有非重叠匹配,作为字符串列表。从左到右扫描字符串,并按找到的顺序返回匹配项。如果模式中存在一个或多个组,则返回组列表;如果模式有多个组,这将是一个元组列表。空匹配包含在结果中,除非它们触及另一个匹配的开始。
从您接受的答案来看,不需要正则表达式
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']]
Python 中的正则表达式(我很确定这对于一般的正则表达式来说是正确的)不允许任意数量的匹配。您可以捕获整个重复匹配项(通过在重复组周围放置捕获括号)或捕获一系列匹配项中的最后一个匹配项(通过重复捕获组)。这与这些是命名的还是编号的捕获组无关。
您需要通过迭代字符串中的所有匹配项以编程方式执行此操作,例如
for match in re.findall(pattern, string):
do_something(match)