Python 正则表达式来匹配关键字列表

Python 正则表达式来匹配关键字列表,python,regex,Python,Regex,我有一个单词列表,可以识别文档的特定部分。关键词的使用方式可能会有所不同。然而,这些关键词与文档文本混合在一起,我只知道一种基本的方法 一些样本关键词将是评估、计划、家族史、当前药物、程序、过敏等 以下是一些示例文本: Family History XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX Social History · No alcohol use Current Meds Allergies · No Known

我有一个单词列表,可以识别文档的特定部分。关键词的使用方式可能会有所不同。然而,这些关键词与文档文本混合在一起,我只知道一种基本的方法

一些样本关键词将是评估、计划、家族史、当前药物、程序、过敏等

以下是一些示例文本:

 Family History
 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX      
 Social History
  · No alcohol use
 Current Meds
 Allergies
  · No Known Drug Allergies      
 Vitals
 Vital Signs [Data Includes: Current Encounter] 
 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX    
    Height     Tall 
    Weight     Well Built               
Physical Exam
Lorem Ipsum is simply dummy text of the printing and typesetting industry
Lorem Ipsum has been the industry's standard dummy text ever since the
1500s, when an unknown printer took a galley of type and scrambled it to    
Assessment
History of Medication
      None
Plan
It is a long established fact that a reader will be distracted by
readable content of a page when looking at its layout. The point of using
Lorem Ipsum is that it has a more-or-less normal distribution of letters,
这就是我迄今为止所做的工作

'.*\bPlan\b|.*\bHistory\b|.*\bMeds\b'

有没有更好的方法在Python中使用Regex查找不区分大小写的术语列表?

您所拥有的应该与

.*\b(Plan|History|Meds)\b
Having.*开头是多余的,只需使用search而不是match来表示regex可以在任何地方找到

然而,您可能真正想要的是确保这些单词是第一个出现在行中的“真实”单词,因此我建议:

\s*(Plan|...
表示只有空格应该出现在开头,或者

\W*(Plan|...
如果您需要更大的灵活性,例如,项目符号\W表示不是单词字符

评论中其他问题的更新:

下面是一个只匹配4个单词的正则表达式示例:

^(\W*\w+\W*){0,4}\W*$
测试:

打印4个真值和1个假值


我试图用词的界限来做,但还是放弃了。老实说,你最好用一个简单的正则表达式来计算字数。除非正则表达式真的适合某项任务,否则不要使用它们:一般来说,代码功能更强大,而且通常更简单。

什么是更好的方法?您使用的当前正则表达式有什么问题吗?也许,如果anyword.lower in text.lower for word in lst:…查看源文本:它不只是一行中一到三个单词的任意集合吗?该列表大约有50个术语,正在计数。根据我有限的知识,我写了这个几乎是字符串查找的正则表达式,但它很混乱,我不知道它会如何影响引擎盖下的性能。@Jongware:它将获得很多。例如示例中的“禁止饮酒”和“无已知过敏”。如果您可以将关键短语保存在一个文件中,并让代码生成上面相应的正则表达式,那就更好了。@JeffY我假设正则表达式将自动生成,我不认为OP会手动构造任何东西。但我仍然觉得指出可以清理的不必要的东西是好的。@Jeff:是的,我将保留一个单独的列表/文件,在我浏览数据时可以附加该列表/文件,并发现更多的变体。@Alex:按照你建议的行进行操作。使用行首和行尾标记环绕代码,并在我的数据上运行。@AlexHall:基于您的答案的类似方法是有效的,除非它匹配到行尾。是否有一种方法可以限制它只匹配行开头的4个单词。表达式:^.*\bP?伊兰| H?iistory | M?ied | E?ixam | Vital\b*$
for i in range(1, 6):
    print bool(re.match(r"^(\W*\w+\W*){0,4}\W*$", "abc " * i))