我正在尝试制作一个能够将任何内容匹配到特定模式的正则表达式。然后,正则表达式将继续查找其他模式,直到字符串末尾,但在某些情况下,该模式将不存在,并且匹配将失败。现在我陷入了困境:
.*?PATTERN
问题是,在字符串不存在的情况下,由于回溯,这会花费太多时间。为了缩短这个时间,我尝试使用正向前瞻来模仿原子分组,如本线程中所述(顺便说一句,我在 python-2.7 中使用 re 模块): Do Python regular expressions have an equivalent to Ruby's atomic grouping?
所以我写道:
(?=(?P<aux1>.*?))(?P=aux1)PATTERN
当然,当 STRING 不存在时,这比以前的版本更快,但问题是,它不再与 STRING 匹配,因为 .匹配到字符串末尾的所有内容,并且在先行后将丢弃先前的状态。
所以问题是,有没有一种方法可以进行像 .*?STRING
这样的匹配,并且在匹配不存在时能够更快地失败?
最佳答案
您可以尝试使用split
如果结果的长度为 1,则表示没有匹配项。如果您得到两个或更多,您就知道第一个是第一场比赛。如果将拆分限制为大小 1,则会短路后面的匹配:
"HI THERE THEO".split("TH", 1) # ['HI ', 'ERE THEO']
结果的第一个元素取决于匹配。
关于Python 正则表达式 : how to match anything up to a specific string and avoid backtraking when failin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22714864/