1

有没有办法在 Python 中动态更新正则表达式组的名称?

例如,如果文本是:

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

在事先不知道有多少人的情况下,如何命名组“person1”、“person2”、“person3”、...和“personN”?

4

4 回答 4

2

不,但你可以这样做:

>>> 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

参考

于 2010-01-07T08:18:36.437 回答
1

命名捕获组和编号组(\1、\2 等)不能是动态的,但您可以使用 findall 实现相同的目的:

re.findall(模式,字符串 [,标志])

返回字符串中模式的所有非重叠匹配,作为字符串列表。从左到右扫描字符串,并按找到的顺序返回匹配项。如果模式中存在一个或多个组,则返回组列表;如果模式有多个组,这将是一个元组列表。空匹配包含在结果中,除非它们触及另一个匹配的开始。

于 2010-01-07T08:19:16.940 回答
1

从您接受的答案来看,不需要正则表达式

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']]
于 2010-01-07T08:38:21.003 回答
0

Python 中的正则表达式(我很确定这对于一般的正则表达式来说是正确的)不允许任意数量的匹配。您可以捕获整个重复匹配项(通过在重复组周围放置捕获括号)或捕获一系列匹配项中的最后一个匹配项(通过重复捕获组)。这与这些是命名的还是编号的捕获组无关。

您需要通过迭代字符串中的所有匹配项以编程方式执行此操作,例如

for match in re.findall(pattern, string):
    do_something(match)
于 2010-01-07T08:20:00.150 回答