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