Python的正则表达式模块:重复'反向引用'似乎无法正常工作

时间:2015-11-13 21:23:33

标签: python regex

注意:我正在使用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()在我打印错误的结果时会返回我想要的内容吗?)

...是的,我正在为我的模式使用原始字符串。

1 个答案:

答案 0 :(得分:1)

您正在使用正则表达式中的捕获组。如果在模式中指定了捕获组,Python .finall将返回捕获文本的元组。因此,您正在寻找.finditer函数。

请参阅Python re.finditer documentation

  

字符串中的RE 模式的所有非重叠匹配上返回iterator产生MatchObject个实例。从左到右扫描字符串,并按找到的顺序返回匹配项。结果中包含空匹配,除非它们触及另一场比赛的开头。

re.findall

  

返回 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模块。