我想要匹配:
第一秒
和
第二个
所以正则表达式:
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中反向引用的错误吗?
答案 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
也是如此。
如果字符串中的任何顺序都有first
和second
,则此正则表达式为真。