我有一个包含一堆字符串的文件,例如“ 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']
匹配的“大小=”部分不见了。(但是,肯定会在搜索中使用它,否则将会有更多结果)。我究竟做错了什么?
您遇到的问题是,如果re.findall尝试匹配的正则表达式捕获组(即,括号中包含的正则表达式部分),则返回的是组,而不是匹配的字符串。
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)