对于这样的问题,您需要确保匹配中有 3 个单词,并且它应该是最小长度。对于我们问题的第一部分,我们需要一个匹配我们的单词和其他单词的任意组合的模式,而且它必须包含所有单词,因此您不能执行以下操作:
(pizza|garlic|jam).*?(pizza|garlic|jam).*?(pizza|garlic|jam)
因为它会匹配类似的东西jam ...pizza...jam
.您需要为您的正则表达式创建所有可以完成的可能性itertools.permutations
,因此您必须选择以下情况之一:
(pizza.*?garlic.*?jam)|(pizza.*?jam.*?garlic)|(garlic.*?pizza.*?jam)|(garlic.*?jam.*?pizza)|(jam.*?pizza.*?garlic)|(jam.*?garlic.*?pizza)
Note在前面的组中,因为您想要最小匹配,所以当然您必须在句子的前导中使用一个单词,在句子的末尾使用一个单词(因为如果您还有其他单词,那么肯定会考虑它是多余的(this is jam and pizza and garlic
)在这句话中this is
是多余的)所以在这里我们创造了所有的可能性优化我们的正则表达式以拒绝额外的搜索 :
>>> l=('pizza', 'garlic', 'jam')
>>> p=[]
>>> for i,j,k in permutations(l,3) :
... m=re.search(r'({}.*?{}.*?{})'.format(i,j,k),text)
... if m :
... p.append(m.group(0))
...
>>> print min(p,key=len)
pizza as well, and garlic bread. But most of all, jam