Python正则表达式中的动态命名组

时间:2010-01-07 08:12:22

标签: python regex regex-group

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

例如,如果文本是:

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

如果事先知道有多少人,你会如何命名群组'person1','person2','person3',...和'personN'?

4 个答案:

答案 0 :(得分: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

参考

答案 1 :(得分:1)

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

  

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

     

返回字符串中所有非重叠的模式匹配,作为列表   字符串。扫描字符串   从左到右,比赛是   按顺序返回。如果一个或   更多的团体出现在   模式,返回组列表;这个   将是一个元组列表,如果   模式有多个组。空   匹配包含在结果中   除非他们触及开头   另一场比赛。

答案 2 :(得分: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']]

答案 3 :(得分:0)

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

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

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