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

4

注意:我正在使用PyPi替代的正则表达式模块

我有一个Python程序,我在其中查找特定格式的重复标签,这些标签由逗号分隔。

格式为:(*单词...*#*数字*)

例如:Trial #1,Trial #2,Run #3Spring trial #13都符合该格式。

我在原始字符串中使用:([\w ]*#\d\d?,)\1* 作为我的正则表达式模式。

在Java和各种正则表达式测试引擎中,使用此模式在以下字符串上使用findall()

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, (...

...) Run #20,Run #20,Run #20,Run #20,Run #20,Run #20,Run #20

返回:

匹配 1: Run #1,Run #1,Run #1,Run #1,Run #1,Run #1,Run #1,

匹配 2: Run #2,Run #2,Run #2,Run #2,Run #2,Run #2,Run #2,

...等等。

但在Python中,它返回:

匹配 1: Run #1,

匹配 2: Run #2,

...等等。

我希望它返回第一个结果(由Java和其他程序的正则表达式返回的结果)

我是否忽略了有关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()到底返回什么?我只是打印结果的方式不对吗?)

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


请使用re.finditer而不是re.findall,因为它将保留所有的组。header1Match = pattern1.finditer(header1) for x in header1Match: print(x.group(0))。我猜你正在使用([\w ]*#\d\d?,)\1*正则表达式 - Wiktor Stribiżew
代码示例中的正则表达式与您问题顶部的不同。例如,如果在匹配项之间的逗号后面有空格,则它将无法匹配,除非第一个匹配项开头有空格... - Tim Pietzcker
еҰӮжһңжӮЁдҪҝз”Ёж Үеҝ—flags=regex.V0жқҘжЁЎд»ҝreжЁЎеқ—зҡ„иЎҢдёәпјҢеҲҷж— йңҖдҪҝз”ЁжӯЈеҲҷиЎЁиҫҫејҸжЁЎеқ—гҖӮ - Casimir et Hippolyte
谢谢!我现在明白了 :)。我会阅读关于“finditer”函数的资料。 - E.Skid
1个回答

1
您在正则表达式中使用了捕获组。如果在模式中指定了捕获组,Python的.finall函数会返回捕获文本的元组。因此,您需要寻找一个.finditer函数。
请参见Python re.finditer文档

在字符串中按顺序扫描,并返回所有非重叠匹配项的迭代器,每个匹配项都是MatchObject实例。结果包含空匹配项,除非它们接触到另一个匹配项的开头。

re.findall
在字符串中查找所有不重叠的pattern,返回一个字符串列表。扫描方向是从左到右,匹配结果按照出现顺序返回。如果模式中存在一个或多个组,则返回该组的列表;如果模式有多个组,则返回元组的列表。以下是使用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,']

"Casimir是正确的,使用如此简单的正则表达式,您可以使用常规re模块。"

1
谢谢!这正是我所需要的! - E.Skid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接