小编典典

re.findall不返回全场比赛吗?

python

我有一个包含一堆字符串的文件,例如“ size =
XXX;”。我第一次尝试使用python的re模块,并且对以下行为感到有些困惑:如果我在正则表达式中使用管道作为“或”,我只会看到返回的匹配项。例如:

>>> myfile = open('testfile.txt','r').read()
>>> print re.findall('size=50;',myfile)
['size=50;', 'size=50;', 'size=50;', 'size=50;']
>>> print re.findall('size=51;',myfile)
['size=51;', 'size=51;', 'size=51;']
>>> print re.findall('size=(50|51);',myfile)
['51', '51', '51', '50', '50', '50', '50']
>>> print re.findall(r'size=(50|51);',myfile)
['51', '51', '51', '50', '50', '50', '50']

匹配的“大小=”部分不见了。(但是,肯定会在搜索中使用它,否则将会有更多结果)。我究竟做错了什么?


阅读 172

收藏
2020-12-20

共1个答案

小编典典

您遇到的问题是,如果re.findall尝试匹配的正则表达式捕获组(即,括号中包含的正则表达式部分),则返回的是组,而不是匹配的字符串。

解决此问题的一种方法是使用非捕获组(前缀为?:)。

>>> import re
>>> s = 'size=50;size=51;'
>>> re.findall('size=(?:50|51);', s)
['size=50;', 'size=51;']

如果re.findall尝试匹配的正则表达式没有捕获任何内容,它将返回整个匹配的字符串。

尽管在这种特殊情况下使用字符类可能是最简单的选择,但非捕获组提供了更通用的解决方案。

我认为您要使用[]而不是()。[]表示字符集,而()表示组匹配。尝试这样的事情:

print re.findall('size=5[01];', myfile)
2020-12-20