考虑以下文字:
foobar¬
nextline
正则表达式(.*?(?: *?\n))
匹配foobar¬
其中¬
表示换行符\ n。
为什么正则表达式匹配它?非捕获组不应该排除它吗?
在Regex101上测试python方言。
答案 0 :(得分:6)
“非捕获组”是指该组内的匹配在结果匹配对象中不能作为单独的组使用。例如:
>>> re.search('(foo)(bar)', 'foobarbaz').groups()
('foo', 'bar')
>>> re.search('(foo)(?:bar)', 'foobarbaz').groups()
('foo',)
但是,作为表达式一部分的所有内容都是匹配,因此出现在结果匹配中(组0显示整个匹配):
>>> re.search('(foo)(bar)', 'foobarbaz').group(0)
'foobar'
>>> re.search('(foo)(?:bar)', 'foobarbaz').group(0)
'foobar'
如果您不想匹配该部分,但仍想确保它在那里,您可以使用超前表达式:
>>> re.search('(foo)(?=bar)', 'foobarbaz')
<_sre.SRE_Match object; span=(0, 3), match='foo'>
>>> re.search('(foo)(?=bar)', 'foobaz')
None
因此,在您的情况下,您可以使用(.*?(?= *?\n))
。
答案 1 :(得分:2)
捕获\n
是因为非捕获组在内部捕获组:
>>> s = 'foobar\nnextline'
>>> re.search(r'(.*?(?: *?\n))', s).groups()
('foobar\n',)
如果您不想要,请将非捕获组放在捕获组
之外>>> re.search(r'(.*?)(?: *?\n)', s).groups()
('foobar',)