gpt4 book ai didi

python - 从列表中的一个字符串中搜索任何单词或单词组合(python)

转载 作者:行者123 更新时间:2023-11-28 22:57:58 24 4
gpt4 key购买 nike

我有一个字符串(例如:"alpha beta charlie, delta&epsilon foxtrot")和一个列表(例如 ["zero","omega virginia","apple beta charlie "])。是否有一种方便的方法来遍历字符串中的每个单词和单词组合,以便在列表中进行搜索?

最佳答案

目的

你说的是组合,但组合在语义上是无序的,你的意思是,你打算找到所有由空格连接的有序排列与目标列表的交集。

首先,我们需要导入我们打算使用的库。

import re
import itertools

分割字符串

不要在字符上进行拆分,您正在对不包含奇怪字符的单词进行语义搜索。由 re 模块提供支持的正则表达式非常适合这一点。在原始Python 字符串,r'',我们在单词的边缘使用正则表达式,\b,围绕任何字母数字字符(和 _ ), \w,大于或等于一的数字,+

re.findall 返回每个匹配项的列表。

re_pattern = r'\b\w+\b'
silly_string = 'alpha beta charlie, delta&epsilon foxtrot'
words = re.findall(re_pattern, silly_string)

这里,words 是我们的单词列表:

>>> print words
['alpha', 'beta', 'charlie', 'delta', 'epsilon', 'foxtrot']

创建排列

继续,我们更喜欢使用生成器来操作我们的数据,以避免在我们需要之前不必要地具体化数据并将大型数据集保存在内存中。 itertools 库有一些很好的函数,可以很好地满足我们的需求,提供上述单词的所有排列并将它们链接到一个可迭代对象中:

_gen = (itertools.permutations(words, i + 1) for i in xrange(len(words)))
all_permutations_gen = itertools.chain(*_gen)

list(all_permutations_gen) 列出 all_permutations_gen 会给我们:

[('alpha',), ('beta',), ('charlie',), ('delta',), ('epsilon',), ('foxtrot',), ('alpha', 'beta'), ('alpha', 'charlie'), ('alpha', 'delta'), ('alpha', 'epsilon'), ('alpha', 'foxtrot'), ('beta', 'alpha'), ('beta', 'charlie'), ('beta', 'delta'), ('beta', 'epsilon'), ('beta', 'foxtrot'), ('charlie', 'alpha'), ('charlie', 'beta'), ('charlie', 'delta'), ('charlie', 'epsilon'), ('charlie', 'foxtrot'), ('delta', 'alpha'), ('delta', 'beta'), ('delta', 'charlie'), ('delta', 'epsilon'), ('delta', 'foxtrot'), ('epsilon', 'alpha'), ('epsilon', 'beta'), ('epsilon', 'charlie'), ('epsilon', 'delta'), ('epsilon', 'foxtrot'), ('foxtrot', 'alpha'), ('foxtrot', 'beta'), ('foxtrot', 'charlie'), ('foxtrot', 'delta'), ('foxtrot', 'epsilon'), ('alpha', 'beta', 'charlie'), ('alpha', 'beta', 'delta'), ...

如果我们在列表而不是集合中具体化生成器,打印前 20 个项目将向我们展示:

>>> print all_permutations[:20] # this only works if you cast as a list instead
['alpha', 'beta', 'charlie', 'delta', 'epsilon', 'foxtrot', 'alpha beta', 'alpha charlie', 'alpha delta', 'alpha epsilon', 'alpha foxtrot', 'beta alpha', 'beta charlie', 'beta delta', 'beta epsilon', 'beta foxtrot', 'charlie alpha', 'charlie beta', 'charlie delta', 'charlie epsilon']

但这会在我们准备好之前耗尽发电机。所以相反,现在我们得到了这些词的所有排列的集合

all_permutations = set(' '.join(i) for i in all_permutations_gen)

检查目标列表中任何排列的成员资格

所以我们看到现在我们可以搜索与目标列表的交集:

>>> target_list = ["zero","omega virginia","apple beta charlie"]
>>> all_permutations.intersection(target_list)
set([])

在这种情况下,对于给定的示例,我们得到空集,但如果我们的目标中有一个字符串在我们的排列集中:

>>> target_list_2 = ["apple beta charlie", "foxtrot alpha beta charlie"]
>>> all_permutations.intersection(target_list_2)
set(['foxtrot alpha beta charlie'])

关于python - 从列表中的一个字符串中搜索任何单词或单词组合(python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14264163/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com