有几个解决方案可以避免灾难性的回溯并允许任何数量的中断!
解决方案 A
这是最干净的解决方案,但需要正则表达式模块(在此处获取二进制文件)。它使用原子分组 ,(?>...)
来避免回溯:
import regex
strExampleFile = '''United Nations & Headquarters
United <br> Nations Headquarters
United Natio<b>ns Hea</b>dquarters'''
strSearch = 'United Nations Headquarters'
strRegex = regex.sub(r'((?<!^).)',r'(?>[\s\S]*?(?=\1))\1',strSearch)
rexRegex = regex.compile(strRegex)
print([objMatch.span() for objMatch in rexRegex.finditer(strExampleFile)])
解决方案 B
如果您既没有安装也不想安装regex模块,可以使用re来模拟原子分组。但是,搜索字符串现在限制为最多 100 个字符:
import re
strExampleFile = '''United Nations & Headquarters
United <br> Nations Headquarters
United Natio<b>ns Hea</b>dquarters'''
strSearch = 'United Nations Headquarters'
strRegex = re.sub(r'((?<!^).)',r'(?=([\s\S]*?(?=\1)))\\##\1',strSearch)
for numBackReference in range(1,len(strSearch)) :
strRegex = strRegex.replace("##", str(numBackReference),1)
rexRegex = re.compile(strRegex)
print([objMatch.span() for objMatch in rexRegex.finditer(strExampleFile)])
注意:正如 femtoRgon 所指出的,这两种方法都可能返回误报。