有没有办法在Python中动态更新正则表达式组的名称?
例如,如果文本是:
person 1: name1
person 2: name2
person 3: name3
...
person N: nameN
如果事先知道有多少人,你会如何命名群组'person1','person2','person3',...和'personN'?
答案 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)