ast*_*tex 2 python string search combinations permutation
我有一个字符串(例如:)"alpha beta charlie, delta&epsilon foxtrot"和一个列表(例如["zero","omega virginia","apple beta charlie"])。是否有一种方便的方法来遍历字符串中的每个单词和单词组合以便在列表中搜索它?
您说的是组合,但组合在语义上是无序的,您的意思是您打算找到由空格与目标列表连接的所有有序排列的交集。
首先,我们需要导入我们打算使用的库。
import re
import itertools
Run Code Online (Sandbox Code Playgroud)
不要拆分字符,您正在对不包括奇怪字符的单词进行语义搜索。由re模块提供支持的正则表达式非常适合于此。在原始 Python 字符串 中r'',我们使用正则表达式来表示单词的边缘, ,\b,围绕任何数字大于或等于 1 的字母数字字符(和_),\w,+。
re.findall 返回每个匹配项的列表。
re_pattern = r'\b\w+\b'
silly_string = 'alpha beta charlie, delta&epsilon foxtrot'
words = re.findall(re_pattern, silly_string)
Run Code Online (Sandbox Code Playgroud)
在这里,词是我们的词表:
>>> print words
['alpha', 'beta', 'charlie', 'delta', 'epsilon', 'foxtrot']
Run Code Online (Sandbox Code Playgroud)
继续,我们更喜欢用生成器操作我们的数据,以避免在我们需要之前不必要地实现数据并将大型数据集保存在内存中。itertools 库有一些很好的函数,它们非常适合我们提供上述单词的所有排列并将它们链接在一个可迭代对象中的需求:
_gen = (itertools.permutations(words, i + 1) for i in xrange(len(words)))
all_permutations_gen = itertools.chain(*_gen)
Run Code Online (Sandbox Code Playgroud)
列出 all_permutations_gen withlist(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'), ...charlie'), ('foxtrot', 'delta'), ('foxtrot', 'epsilon'), ('alpha', 'beta', 'charlie'), ('alpha', 'beta', 'delta' ), ...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']
Run Code Online (Sandbox Code Playgroud)
但这会在我们准备好之前耗尽发电机。所以相反,现在我们得到了这些词的所有排列的集合
all_permutations = set(' '.join(i) for i in all_permutations_gen)
Run Code Online (Sandbox Code Playgroud)
所以我们看到,我们现在可以搜索与目标列表的交集:
>>> target_list = ["zero","omega virginia","apple beta charlie"]
>>> all_permutations.intersection(target_list)
set([])
Run Code Online (Sandbox Code Playgroud)
在这种情况下,对于给出的示例,我们得到空集,但是如果目标中有一个字符串,它在我们的排列集中:
>>> target_list_2 = ["apple beta charlie", "foxtrot alpha beta charlie"]
>>> all_permutations.intersection(target_list_2)
set(['foxtrot alpha beta charlie'])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3745 次 |
| 最近记录: |