正则表达式重叠包含
Regular Expression overlap inclusion
假设我想在一个字符串中搜索一堆标签,其中一些标签可以是其他标签的子字符串。例如,我想在文本 "He attended UC Berkeley last year." 中搜索标签 ["UC"、"UC Berkeley"、"Berkeley"] 我希望所有三个标签都显示出来。但是,当我在 Python 中 运行 时,我只得到 "UC" 和 "Berkeley":
import re
string = "He attended UC Berkeley last year."
compiled_regexp = re.compile("UC|UC Berkeley|Berkeley", re.IGNORECASE)
re.findall(compiled_regexp, string)
# result is: ['UC', 'Berkeley']
如何让所有三个标签都显示出来?
我的实际用例涉及数以万计的标签,其中许多是其他标签的前缀。还有一些标签是其他标签的前缀,这些标签本身是其他标签的前缀等等(比如 ["UC"、"UCB"、"UCBA" ...])这是不可行的为其他标签的所有前缀手动创建捕获组。有更好的方法吗?
更新:
我决定执行以下操作:
首先,我找到所有作为其他标签前缀的标签。然后我构建了两个单独的正则表达式,一个用于前缀标签,另一个用于非前缀标签。最后,我使用两个正则表达式搜索字符串并合并结果。
re.findall() 不支持重叠匹配和 'UC' 与 'UC Berkley' 重叠以及 'Berkley 和 'UC Berkley'.
之间的重叠
目标字符串数量少的解决方法
如果您只有几个目标字符串,那么手动构建正则表达式模式并执行搜索仍然可行,如下所示:
import re
string = "He attended UC Berkeley last year."
compiled_regexp = re.compile(r"((UC) (Berkeley)|UC|Berkeley)", re.IGNORECASE)
matches = re.findall(compiled_regexp, string)
print(matches)
给出输出:
[('UC Berkeley', 'UC', 'Berkeley')]
有关此正则表达式模式的更多说明,请参阅 regex101。
一般解决方案
我不知道有什么简单的方法可以使用正则表达式来搜索大量重叠的相同起始位置目标字符串(似乎 )。但是,只要您的目标字符串是固定的,列表推导式就可以完成这项工作:
string = "He attended UC Berkeley last year."
targets = ["UC Berkeley", "UC", "Berkeley"]
string_lower = string.lower()
found = [target for target in targets if target.lower() in string_lower]
print(found)
输出为:
['UC Berkeley', 'UC', 'Berkeley']
假设我想在一个字符串中搜索一堆标签,其中一些标签可以是其他标签的子字符串。例如,我想在文本 "He attended UC Berkeley last year." 中搜索标签 ["UC"、"UC Berkeley"、"Berkeley"] 我希望所有三个标签都显示出来。但是,当我在 Python 中 运行 时,我只得到 "UC" 和 "Berkeley":
import re
string = "He attended UC Berkeley last year."
compiled_regexp = re.compile("UC|UC Berkeley|Berkeley", re.IGNORECASE)
re.findall(compiled_regexp, string)
# result is: ['UC', 'Berkeley']
如何让所有三个标签都显示出来?
我的实际用例涉及数以万计的标签,其中许多是其他标签的前缀。还有一些标签是其他标签的前缀,这些标签本身是其他标签的前缀等等(比如 ["UC"、"UCB"、"UCBA" ...])这是不可行的为其他标签的所有前缀手动创建捕获组。有更好的方法吗?
更新:
我决定执行以下操作:
首先,我找到所有作为其他标签前缀的标签。然后我构建了两个单独的正则表达式,一个用于前缀标签,另一个用于非前缀标签。最后,我使用两个正则表达式搜索字符串并合并结果。
re.findall() 不支持重叠匹配和 'UC' 与 'UC Berkley' 重叠以及 'Berkley 和 'UC Berkley'.
之间的重叠目标字符串数量少的解决方法
如果您只有几个目标字符串,那么手动构建正则表达式模式并执行搜索仍然可行,如下所示:
import re
string = "He attended UC Berkeley last year."
compiled_regexp = re.compile(r"((UC) (Berkeley)|UC|Berkeley)", re.IGNORECASE)
matches = re.findall(compiled_regexp, string)
print(matches)
给出输出:
[('UC Berkeley', 'UC', 'Berkeley')]
有关此正则表达式模式的更多说明,请参阅 regex101。
一般解决方案
我不知道有什么简单的方法可以使用正则表达式来搜索大量重叠的相同起始位置目标字符串(似乎
string = "He attended UC Berkeley last year."
targets = ["UC Berkeley", "UC", "Berkeley"]
string_lower = string.lower()
found = [target for target in targets if target.lower() in string_lower]
print(found)
输出为:
['UC Berkeley', 'UC', 'Berkeley']