Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.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_String_Search_Combinations_Permutation - Fatal编程技术网

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

从列表中的一个字符串中搜索任意单词或单词组合(python),python,string,search,combinations,permutation,Python,String,Search,Combinations,Permutation,我有一个字符串(例如:“alpha-beta-charlie,delta&epsilon-foxtrot”)和一个列表(例如[“zero”,“omega-virginia”,“apple-beta-charlie”])。是否有一种方便的方法来遍历字符串中的每个单词和单词组合,以便在列表中搜索它? 你说的是组合,但组合在语义上是无序的,你的意思是,你想要找到所有有序排列的交集,这些排列由空格和目标列表连接 首先,我们需要导入我们打算使用的库 import re import itertools

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

你说的是组合,但组合在语义上是无序的,你的意思是,你想要找到所有有序排列的交集,这些排列由空格和目标列表连接

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

import re
import itertools
拆线 不要对字符进行拆分,您正在对不包含奇怪字符的单词进行语义搜索。 由
re
模块提供支持的正则表达式非常适合于此。未经加工 Python字符串,
r'
,我们使用正则表达式作为单词的边缘,
\b
,围绕任何字母数字字符(
\u
),
\w
,数字大于或等于一,
+

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

re_pattern = r'\b\w+\b'
silly_string = 'alpha beta charlie, delta&epsilon foxtrot'
words = re.findall(re_pattern, silly_string)
这里,单词是我们的单词列表:

>>> print words
['alpha', 'beta', 'charlie', 'delta', 'epsilon', 'foxtrot']
创建排列 接着,我们更喜欢使用生成器来操作数据,以避免在需要数据之前不必要地将数据物化,并在内存中保存大型数据集。itertools库有一些很好的函数,可以很好地满足我们提供上述单词的所有排列并将它们链接到单个iterable中的需要:

_gen = (itertools.permutations(words, i + 1) for i in xrange(len(words)))
all_permutations_gen = itertools.chain(*_gen)
列表列出所有排列(所有排列)
将为我们提供:

[('alpha',),('beta',),('charlie',),('delta',),('epsilon',), ('foxtrot',),('alpha','beta'),('alpha','charlie'),('alpha',', "δ","α","ε","α","狐步","β",, “α”)、(“β”、“查理”)、(“β”、“δ”)、(“β”、“ε”), ('beta','foxtrot'),('charlie','alpha'),('charlie','beta'), ('charlie','delta'),('charlie','epsilon'),('charlie','foxtrot'), ('delta','alpha'),('delta','beta'),('delta','charlie'),('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'])

是《查理狐步舞》字符串中的有效组合?不。由@WaleedKhan发布的链接有一个解决方案。好的,是的,我看到了。但是如果字符串中有用逗号分隔的短语,那么简单的用逗号拆分并将两个列表都转换为要设置的列表,然后通过它们的交集可以在短时间内完成这项工作:)检查组合的唯一方法要应用到有序列表,首先要检查每个排列,因此,组合在这方面是错误的。您需要排列。如果目标列表的字符串的单词没有预先排序,则这些注释中链接的组合解决方案将是不完整的,这似乎不是一个明确的假设(尽管回想起来,可能是这样)。