Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果字符串中存在列表中的任何关键字,则进行匹配_Python_Regex - Fatal编程技术网

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组合进行拆分(见下面我的注释)。