python - 正则表达式重叠包含

标签 python regex regex-lookarounds regex-group

假设我想在字符串中搜索一堆标签,其中一些标签可以是其他标签的子字符串。例如,我想在文本“He 去年参加了加州大学伯克利分校”中搜索标签 [“UC”、“加州大学伯克利分校”、“伯克利分校”]。我希望所有三个标签都能显示出来。然而,当我在 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”...]) 手动为所有标签创建捕获组是不可行的其他标签的前缀。有更好的方法吗?

<小时/>

更新:
我决定执行以下操作:
首先,我找到所有作为其他标签前缀的标签。然后我构建两个单独的正则表达式,一个用于前缀标签,另一个用于非前缀标签。最后,我使用两个正则表达式搜索字符串并合并结果。

最佳答案

少量目标字符串的解决方案

如果您只有几个目标字符串,那么手动构建正则表达式模式并执行搜索仍然可行,如下所示:

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 .

通用解决方案

我不知道有什么简单的方法可以使用正则表达式来搜索大量重叠的相同起始位置目标字符串(看起来 regex just isn't really designed for this scenario )。但是,只要您的目标字符串是固定的,列表理解就应该能够完成这项工作:

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']

关于python - 正则表达式重叠包含,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53998762/

相关文章:

python - Pandas DataFrame.to_csv 引发 IOError : No such file or directory

python - 为什么这个 python 只捕获一个数字?

javascript - 第一次使用正则表达式

java - perl 和 java 正则表达式功能之间有什么区别?

java - 使用 replaceAll 和正则表达式前置字符串

python - 用 Python 打包数据

python - 将数组添加到 Pandas 数据框中

java - 正则表达式查找不匹配的字符串中的整数

带有一个特定数字和一个单词的正则表达式

java - 捕获未跟随某些数字的数字流