检查另一个字符串中的单词列表

我可以在巨蟒里做这样的事情:

l = ['one', 'two', 'three']
if 'some word' in l:
...

这将检查列表中是否存在“某个单词”。但是我可以做反向操作吗?

l = ['one', 'two', 'three']
if l in 'some one long two phrase three':
...

我必须检查字符串中是否有一些来自 array 的单词。我可以使用循环来完成这项工作,但是这种方法有更多的代码行。

256626 次浏览
if any(word in 'some one long two phrase three' for word in list_):

这里有一些可供选择的方法,它们可能比 KennyTM 的答案更快,也可能更合适,这取决于上下文。

1)使用正则表达式:

import re
words_re = re.compile("|".join(list_of_words))


if words_re.search('some one long two phrase three'):
# do logic you want to perform

2)如果你想匹配整个单词,你可以使用集合,例如,你不想在短语“ them 定理是理论的”中找到单词“ the”:

word_set = set(list_of_words)
phrase_set = set('some one long two phrase three'.split())
if word_set.intersection(phrase_set):
# do stuff

当然,您也可以使用“ b”标记使用 regex 进行整个单词匹配。

这些和 Kenny 的解决方案的性能将取决于几个因素,比如单词列表和短语字符串的长度,以及它们更改的频率。如果性能不是问题,那么就选择最简单的,可能就是肯尼的问题。

如果你的单词列表非常长,而且你需要多次进行这个测试,那么将列表转换成一个集合并使用集合交集进行测试可能是值得的(这样做还有一个额外的好处,那就是你可以得到两个列表中的实际单词) :

>>> long_word_list = 'some one long two phrase three about above along after against'
>>> long_word_set = set(long_word_list.split())
>>> set('word along river'.split()) & long_word_set
set(['along'])

解决这个问题最简单的方法是使用 是的

import re


search_list = ['one', 'two', 'there']
long_string = 'some one long two phrase three'
if re.compile('|'.join(search_list),re.IGNORECASE).search(long_string): #re.IGNORECASE is used to ignore case
# Do Something if word is present
else:
# Do Something else if word is not present