为什么正则表达式(。*?(?:*?\ n))会捕获换行符?

时间:2016-07-28 07:12:51

标签: python regex

考虑以下文字:

foobar¬
nextline

正则表达式(.*?(?: *?\n))匹配foobar¬ 其中¬表示换行符\ n。

为什么正则表达式匹配它?非捕获组不应该排除它吗?

Regex101上测试python方言。

2 个答案:

答案 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',)