Python:附加两个正则表达式

时间:2019-01-30 20:41:43

标签: python regex

我有两个正则表达式(或者是它们的模式字符串),我想将它们连接起来。

给定re1re2,我想构造re3,其中re3匹配S,而re1匹配S的前缀,并且然后re2匹配其余部分。

一些坏主意:

  1. 匹配re1,然后匹配re2。例如,对于字符串“ xxx”上的/x*/ + /x/,此操作将失败,因为贪婪的匹配消耗了最后一个x。

  2. 附加图案。例如,这在/a|b/ + /c/上失败,因为这会产生/a|bc/,并且|的优先级比连接的优先级低。

一些更好的主意:

  1. 将模式附加在非捕获组中。解决了优先权问题;但是,它会误处理回引用。目前,这是我最不想要的主意。

  2. 通过枚举re1可以匹配S的所有方式来“手动回溯”,然后在匹配后的其余部分上依次re2。不幸的是,Python似乎对此没有任何支持。

还有更好的方法吗?谢谢!

1 个答案:

答案 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!")