匹配不连续/中断字符串

2024-04-26 07:42:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个预定义的字符串列表,我想在一个大的文本文件中匹配。问题是,文本中确实存在许多这样的字符串,但是被我想要保留的伪字符/htmlxml标记打断。在

例如,我想匹配“联合国总部” 它可以以以下形式存在于文本中:

United Nations & Headquarters
United <br> Nations Headquarters
United Natio<b>ns Hea</b>dquarters

我基本上需要知道这些字符串的位置,稍后我将处理这些伪字符。对于非中断字符串,我要做的是:

^{pr2}$

有没有一些设置可以让正则表达式以某种方式忽略这些中断,或者解决方案是什么?在


Tags: 字符串标记文本br列表字符形式united
2条回答

有两个解决方案可以避免灾难性的回溯允许任何数量的中断!


解决方案A

这是最干净的解决方案,但需要regex模块(win二进制文件here)。它使用原子分组,(?>...),以避免回溯:

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个字符:

^{pr2}$

注意:正如femtoRgon所指出的,这两种方法都会返回假阳性。在

import re

text = """United Nations & Headquarters
United <br> Nations Headquarters
United Natio<b>ns Hea</b>dquarters"""

s = "United Nations Headquarters"

r = re.compile(".*?".join(s))
print([v.span() for v in r.finditer(text)])

关键是".*?".join(s),它在s的每对连续字符之间插入{},将其转换为正则表达式。在

如果您想限制允许的中断,您可能更愿意将.*?收紧一点。在

相关问题 更多 >