检查另一个字符串中的单词列表[重复]

Posted

技术标签:

【中文标题】检查另一个字符串中的单词列表[重复]【英文标题】:Check list of words in another string [duplicate] 【发布时间】:2011-03-17 08:02:26 【问题描述】:

我可以在 python 中做这样的事情:

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

这将检查列表中是否存在“某个单词”。但是我可以做相反的事情吗?

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

我必须检查数组中的某些单词是否在字符串中。我可以使用循环来做到这一点,但这种方式有更多的代码行。

【问题讨论】:

使用“list”作为变量名会给你带来麻烦,因为它隐藏了python“list” @F***,是的,当然。仅供参考。 优先考虑可读性优于代码行数。在这种情况下,any 是一个完美的选择,但有时使用更多的线条比一个衬里更好 【参考方案1】:
if any(word in 'some one long two phrase three' for word in list_):

【讨论】:

@Ockonal: 如果您想检查该列表中的 所有 个单词是否在字符串中,只需将上面的 any() 替换为 all() 请注意,如果 'me' 在 list_ 中,它将被视为匹配,因为 'me' 在 'some' 中。如果您只想匹配整个单词,则需要更改为 any(word in 'some one long two phrase three'.split() for word in list_),就像我在答案中创建集合时所做的那样。 @VedGupta,使用len 代替any? :) docs.python.org/3/library/functions.html#len 这仅在我使用列表理解时才对我有用:any([word in 'some one long two phrase three' for word in list_]) 这是我所期望的 - 不知道没有它它是如何工作的。 @nlogn: words = [word for word in list_ if word in 'long phrase'](或使用filter)。【参考方案2】:

这里有几种替代方法,可能比 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) 如果你想匹配整个单词,你可以使用集合,例如您不想在“它们的定理是理论上的”短语中找到“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”标记对正则表达式进行全词匹配。

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

【讨论】:

感谢您的回答。并且,请在第二行 list_of_words 之后添加引号。 刚刚尝试了python 3.3中的最后一个我不得不使用if word_set.intersection(phrase_set): @dave 如果我的单词列表长度为 30-50 个单词,而我的字符串最多为 300 个单词,这是一种更有效的方法。而且我必须进行超过 10 万次这样的比较? @ketanbhatt 这将取决于许多因素。你需要匹配整个单词吗?大部分字符串会没有匹配项吗?列表中的某些单词会比其他单词出现得更多吗?您需要对具有代表性的字符串子集对每个备选方案进行计时,以查看哪一个表现最佳。 对于与“\b”标记匹配的整个单词:words_re = re.compile(r"\b" + r"\b|".join(list_of_words)+r"\b")【参考方案3】:

如果您的单词列表很长,并且您需要多次执行此测试,则可能值得将列表转换为集合并使用集合交集进行测试(您将获得实际的额外好处两个列表中的单词):

>>> 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'])

【讨论】:

这与它只是检查空格分隔的单词是否与您要查找的单词匹配不同。例如,您将无法在 foobar 中找到 foo @poke - 是的。我不清楚 OP 是否需要这种部分/嵌入的单词匹配。通常情况下,人们会为较大的字符串中的单词编写代码测试,假设他们正在执行单词匹配,但实际上正在执行字符串匹配。此方法根据一组完整的单词检查整个单词,而不查找任何嵌入的匹配项(例如匹配 'about' 中的 'out')。 是的,我只是认为有必要提及您的解决方案(顺便说一句,这是一个很好的解决方案。)与in 运算符的行为不同。【参考方案4】:

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

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

【讨论】:

以上是关于检查另一个字符串中的单词列表[重复]的主要内容,如果未能解决你的问题,请参考以下文章

用于检查值是否在列表中不适用于集合的逻辑

审查(银)

需要 c# 正则表达式将逗号列表中的任何单词与另一个字符串中的任何单词匹配

如何进行`if`检查键入的单词是不是等于C中字符串列表中的某个单词? [复制]

2019-6-14考试总结

Python过滤器功能-如果列表中的单词以特定字符开头[重复]