如何处理正则表达式混合案例?

时间:2019-06-19 03:53:42

标签: python regex

我有要搜索的关键字列表。它们中的大多数不区分大小写,但其中一些是区分大小写的,例如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)

2 个答案:

答案 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 regexoptional mode modifiers的某种组合,如相应链接中所示。