我有一个文件,其中包含一堆字符串,如“size=XXX;”。我是第一次尝试 Python 的 re
模块,并且对以下行为感到有点困惑:如果我在正则表达式中使用管道表示“或”,我只会看到返回的匹配项。例如:
>>> myfile = open('testfile.txt', 'r').read()
>>> re.findall('size=50;', myfile)
['size=50;', 'size=50;', 'size=50;', 'size=50;']
>>> re.findall('size=51;', myfile)
['size=51;', 'size=51;', 'size=51;']
>>> re.findall('size=(50|51);', myfile)
['51', '51', '51', '50', '50', '50', '50']
>>> re.findall(r'size=(50|51);', myfile)
['51', '51', '51', '50', '50', '50', '50']
匹配的“size=”部分没有了(但肯定是用在搜索中的,不然结果会多)。我究竟做错了什么?
原文由 Ben S. 发布,翻译遵循 CC BY-SA 4.0 许可协议
你遇到的问题是,如果正则表达式
re.findall
试图匹配捕获组(即正则表达式中括号中的部分),那么返回的是组,而不是匹配的字符串.解决此问题的一种方法是使用非捕获组(前缀为
?:
)。如果
re.findall
尝试匹配的正则表达式没有捕获任何内容,它会返回整个匹配的字符串。虽然在这种特殊情况下使用 字符类 可能是最简单的选择,但非捕获组提供了更通用的解决方案。