注意:我正在使用PyPi替代正则表达式模块
我有一个python程序,我正在寻找特定格式的重复标签,用逗号分隔。
格式为:(* words ... *#* number *)
例如:Trial #1, Trial #2, Run #3,
和Spring trial #13
都符合格式。
我在原始字符串中使用:([\w ]*#\d\d?,)\1*
作为我的正则表达式模式。
在java和各种正则表达式测试引擎中,在字符串上使用带有此模式的findall()
:
运行#1,运行#1,运行#1,运行#1,运行#1,运行#1,运行#1,运行#2,运行#2,运行#2,运行#2,运行#2 ,运行#2,运行#2,运行#3,运行#3,运行#3,运行#3,运行#3,运行#3,运行#3,(...
...)运行#20,运行#20,运行#20,运行#20,运行#20,运行#20,运行#20
返回:
匹配1:运行#1,运行#1,运行#1,运行#1,运行#1,运行#1,运行#1,
匹配2:运行#2,运行#2,运行#2,运行#2,运行#2,运行#2,运行#2,
...等
但在python中,它返回:
匹配1:运行#1,
匹配2:运行#2,
...等
我希望它返回第一个结果(java' s和其他程序的正则表达式返回的结果)
我是否忽视了python的正则表达式引擎?为什么我得到这个结果?
我的代码是:
import regex
file = open('Pendulum Data.csv',mode='r')
header1 = file.readline()
header2 = file.readline()
pattern1 = regex.compile(r'([\w ]*#\d\d?)\1*',flags=regex.V0)
header1Match = pattern1.findall(header1)
for x in header1Match:
print(x)
for循环和print语句用于查看结果。
(这让我想到另一个问题:regex.findall()
到底是什么回归?findall()
在我打印错误的结果时会返回我想要的内容吗?)
...是的,我正在为我的模式使用原始字符串。
答案 0 :(得分:1)
您正在使用正则表达式中的捕获组。如果在模式中指定了捕获组,Python .finall
将返回捕获文本的元组。因此,您正在寻找.finditer
函数。
请参阅Python re.finditer
documentation:
在字符串中的RE 模式的所有非重叠匹配上返回iterator产生MatchObject个实例。从左到右扫描字符串,并按找到的顺序返回匹配项。结果中包含空匹配,除非它们触及另一场比赛的开头。
返回 string 中 pattern 的所有非重叠匹配项,作为字符串列表。从左到右扫描字符串,并按找到的顺序返回匹配项。 如果模式中存在一个或多个组,则返回组列表;如果模式有多个组,这将是一个元组列表。
以下是small demo使用re.finditer
:
import re
p = re.compile(r'([\w ]*#\d\d?,)\1*')
test_str = "Run #1,Run #1,Run #1,Run #1,Run #1,Run #1,Run #1,Run #2,Run #2,Run #2,Run #2,Run #2,Run #2,Run #2,Run #3,Run #3,Run #3,Run #3,Run #3,Run #3,Run #3, (..."
print [x.group() for x in p.finditer(test_str)]
结果:
['Run #1,Run #1,Run #1,Run #1,Run #1,Run #1,Run #1,', 'Run #2,Run #2,Run #2,Run #2,Run #2,Run #2,Run #2,', 'Run #3,Run #3,Run #3,Run #3,Run #3,Run #3,Run #3,']
卡西米尔是对的,有这么一个微不足道的常规表现,你可以使用常规的re
模块。