我有要搜索的关键字列表。它们中的大多数不区分大小写,但其中一些是区分大小写的,例如IT或IT。用于信息技术。通常,我将所有关键字与“ |”连在一起,并将标记设置为re.I。这将引起区分大小写的关键字的麻烦。有一个简单的方法可以解决此问题吗?还是我必须对区分大小写的内容进行单独搜索?谢谢!
keywords = ["internal control", "IT",... and many more]
patterns = r"\b(" + "|".join(keywords) + r")\b"
m = re.findall(patterns, text, flags = re.I)
答案 0 :(得分:2)
您可以使用(?-i:...)
修饰符为该组关闭不区分大小写的搜索。但它仅适用于Python 3.6 +:
import re
s = "Internal control, it IT it's, Keyword2"
keywords = ["internal control", "IT", "keyword2"]
pattern = '|'.join(r'((?-i:\b{}\b))'.format(re.escape(k)) if k.upper() == k else r'(\b{}\b)'.format(re.escape(k)) for k in keywords)
print(re.findall(pattern, s, flags=re.I))
打印:
[('Internal control', '', ''), ('', 'IT', ''), ('', '', 'Keyword2')]
从Python 3.6 documentation:
(?imsx-imsx:...)
(来自集合“ i”,“ m”,“ s”,“ x”的零个或多个字母,可选后跟“-”,然后是来自同一集合的一个或多个字母。) 字母设置或删除相应的标志:re.I(忽略 大小写),re.M(多行),re.S(所有点都匹配)和re.X(详细), 对于表达式的一部分。 (这些标志在模块中进行了描述 内容。)
答案 1 :(得分:1)
(将其发布为答案,因为它太多了,无法发表评论)
我仍然认为两个单独的搜索会更简洁。因此,这可能是学术性的:您可以使用Conditional regex和optional mode modifiers的某种组合,如相应链接中所示。