Python 如果字符串中存在列表中的任何关键字,则进行匹配
我有一个关键字列表。一个样本是:Python 如果字符串中存在列表中的任何关键字,则进行匹配,python,regex,Python,Regex,我有一个关键字列表。一个样本是: ['IO', 'IO Combination','CPI Combos'] 现在我要做的是看看这些关键字是否存在于字符串中。例如,如果我的字符串是:,那么2018年夏天将有一场IO竞赛。因此,对于这个示例,因为它包含IO,所以它应该识别这个字符串,但是如果字符串是,2018年夏天将有一场比赛,那么它不应该识别任何关键字 我编写了这段Python代码,但它也在竞赛中标识了IO: if any(word.lower() in string_1.lower() f
['IO', 'IO Combination','CPI Combos']
现在我要做的是看看这些关键字是否存在于字符串中。例如,如果我的字符串是:,那么2018年夏天将有一场IO竞赛
。因此,对于这个示例,因为它包含IO
,所以它应该识别这个字符串,但是如果字符串是,2018年夏天将有一场比赛
,那么它不应该识别任何关键字
我编写了这段Python代码,但它也在竞赛中标识了IO
:
if any(word.lower() in string_1.lower() for word in keyword_list):
print('FOUND A KEYWORD IN STRING')
我还想确定字符串中标识了哪个关键字(如果有)。我的代码中存在什么问题?如何确保它只匹配完整的单词
for index,key in enumerate(mylist):
if key.find(mystring) != -1:
return index
它在列表上循环,在列表中的每个项目上检查字符串是否包含在项目中,如果包含,则返回-1,这意味着它包含在项目中,如果出现这种情况,您将在。Regex solution的帮助下获得项目的索引
您需要在此处实现单词边界:
import re
keywords = ['IO', 'IO Combination','CPI Combos']
words_flat = "|".join(r'\b{}\b'.format(word) for word in keywords)
rx = re.compile(words_flat)
string = "there is a IO competition coming in Summer 2018"
match = rx.search(string)
if match:
print("Found: {}".format(match.group(0)))
else:
print("Not found")
在这里,您的列表两边都有|
和\b
。
之后,您可以使用re.search()
进行搜索,该搜索在本例中打印“Found:IO”
更简短的直接理解:
rx = re.compile("|".join(r'\b{}\b'.format(word) for word in keywords))
非正则解
请注意,您甚至可以对单个单词使用非正则表达式解决方案,您只需重新排列理解顺序并使用split()
found = any(word in keywords for word in string.split())
if found:
# do sth. here
笔记
后者有字符串类似的缺点
there is a IO. competition coming in Summer 2018
# ---^---
如果它们在正则表达式解决方案中算作一个“单词”,则不起作用(因此这些方法产生了不同的结果)。此外,由于使用了split()
函数,无法找到像CPI Combos
这样的组合短语。regex解决方案的优点是甚至支持小写和大写场景(只需应用flag=re.IGNORECASE
)
这取决于你的实际需求 我认为这应该是mystring.find(key)
如果key
是您要查找的子字符串。但即使有了这样的改变,这看起来也不像OP所列出的尝试的Python版本。@heemayl:发现了非正则表达式解决方案的一个缺点:由于split()
,无法找到像CPI Combos
这样的组合短语。因此对于带有ignorecase的非正则表达式版本,搜索将是-flag.search(string)
?我如何识别字符串中存在的关键字?@usr2564301:请这样做。另外,我对纯非正则表达式的解决方案很感兴趣。@Jan:因为没有繁琐的标点符号(逗号或(分号)),所以可以使用bog标准拆分。这是相当琐碎的,所以我不建议作为一个答案。(哈!你也提到了那个标点符号。在这里,我今天的最后一次投票@usr2564301:no,尝试结合CPI组合进行拆分(见下面我的注释)。