如何从两个列表中打印匹配的关键字

时间:2018-07-23 20:48:13

标签: python regex string list

jd = "looking for Hadoop Developer Good knowledge of SAP Workflow and SAP HANA"    
tech=['hadoop developer','sap workflow','sap hana']    
string_split = jd.split()    
matched = set(jd) & set(tech)

output:
matched
Out[9]: set()

如何打印匹配的两个单词,例如:

hadoop developer,sap hana,sap workflow

3 个答案:

答案 0 :(得分:1)

简单的列表理解将起作用。这样做的关键是迫使jd降低,否则将无法正确匹配。

[i for i in tech if i in jd.lower()]
['hadoop developer', 'sap workflow', 'sap hana']

答案 1 :(得分:1)

您还可以在此处使用re.findall

import re
print(re.findall("|".join(tech), jd.lower()))
#['hadoop developer', 'sap workflow', 'sap hana']

|字符是正则表达式语法中的OR运算符。我们使用它来加入tech中的术语。然后findall将返回字符串中该模式的所有匹配项。

默认情况下,这是区分大小写的,但是如果您不想使输入字符串小写,则可以添加IGNORECASE标志。

re.findall("|".join(tech), jd, flags=re.IGNORECASE)
#['Hadoop Developer', 'SAP Workflow', 'SAP HANA']

答案 2 :(得分:0)

执行此操作的最佳方法取决于您的数据。如果您的 tech 列表中只有很少的项目,那么@pault解决方案将满足您的需求(但是我建议在模式中添加单词边界,以避免误报),但是如果您有很多项目,则可以玩游戏。

您必须构建所有两个单词序列的集合,然后从技术列表中找到它与集合之间的交集。

要查找 jd 中两个单词的所有序列,我在超前断言内使用捕获组。由于先行不消耗字符,因此该模式能够找到两个单词的所有重叠序列:寻找 hadoop hadoop开发人员,...开头的\b和第二个\w的贪婪量词可确保匹配项仅包含整个单词,而不包含单词的一部分。

import re

jd = "looking for Hadoop Developer Good knowledge of SAP Workflow and SAP HANA"    
tech=['hadoop developer','sap workflow','sap hana']

two_words = re.findall('\b(?=(\w+\W*\w+))', jd.lower())
print(','.join(list(set(two_words) ^ set(tech))))

demo