python中的模块重新出错(反向引用)?

时间:2014-04-10 15:04:21

标签: python regex backreference

我想要匹配:

  

第一秒

  

第二个

所以正则表达式:

re.match(r'(?:(?P<f>first) (?P<s>second)|(?P=s) (?P=f))', 'first second')

匹配,但是这个:

re.match(r'(?:(?P<f>first) (?P<s>second)|(?P=s) (?P=f))', 'second first')

不匹配。这是A | B中反向引用的错误吗?

2 个答案:

答案 0 :(得分:2)

您误解了的反向引用。对于匹配任何内容的反向引用,原始引用必须匹配 too

在您的第二个示例中,(?P<f>first)组与任何内容都不匹配,因此(?P=f)后退引用也无法与之匹配。

后面的引用是错误的工具;你必须重复至少一个你的小组,字面意思是:

r'(?:(?P<f>first )?(?P<s>second)(?(f)| first))'
如果在first之前没有second匹配,

将使用仅在f之后匹配second的条件模式:

>>> import re
>>> pattern = re.compile(r'(?:(?P<f>first )?(?P<s>second)(?(f)$| first))')
>>> pattern.match('first second').group()
'first second'
>>> pattern.match('second first').group()
'second first'

答案 1 :(得分:0)

怎么样:

(?=.*(?P<f>first))(?=.*(?P<s>second))

(?=...)是一个正数lookahead,它假定单词first出现在字符串中的某个位置而不使其成为匹配的一部分(它是一个零长度断言)。 second也是如此。

如果字符串中的任何顺序都有firstsecond,则此正则表达式为真。