我有两个正则表达式(或者是它们的模式字符串),我想将它们连接起来。
给定re1
和re2
,我想构造re3
,其中re3
匹配S,而re1
匹配S的前缀,并且然后re2
匹配其余部分。
一些坏主意:
匹配re1
,然后匹配re2
。例如,对于字符串“ xxx”上的/x*/ + /x/
,此操作将失败,因为贪婪的匹配消耗了最后一个x。
附加图案。例如,这在/a|b/
+ /c/
上失败,因为这会产生/a|bc/
,并且|
的优先级比连接的优先级低。
一些更好的主意:
将模式附加在非捕获组中。解决了优先权问题;但是,它会误处理回引用。目前,这是我最不想要的主意。
通过枚举re1
可以匹配S的所有方式来“手动回溯”,然后在匹配后的其余部分上依次re2
。不幸的是,Python似乎对此没有任何支持。
还有更好的方法吗?谢谢!
答案 0 :(得分:1)
正则表达式连接在一起;实际上,这是从基础构造更复杂的正则表达式的基本规则之一。但是,这样做可能需要显式括号。
re1 = 'x*'
re2 = 'x'
# This works because 'x*x' and '(x*)x' are equivalent regular expressions
if re.match(re1 + re2, 'xxx'):
print("Success!")
re1 = 'a|b'
re2 = 'c'
# Here, you need the parentheses because 'a|bc' and '(a|b)c' are not equivalent.
# "Parentheses" here means a non-capturing group.
if re.match("(?:%s)%s" % (re1, re2), "ac"):
print("Success!")