正则表达式会使3个单词彼此靠近。如何了解他们的背景?

2024-04-24 21:22:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面的绳子:

text = "I love jam. I like all other kinds of confectionery as well--cakes and croissants and things. Bagels too! Carbs for the win I say. And my other favorite kinds of food are mostly bread based - bread itself, so many different kinds of bread. I love the ones with herbs and cheese in it. I like pizza as well, and garlic bread. But most of all, jam."

现在,我想找出“果酱”、“比萨饼”和“大蒜”这三个词在哪里相邻。所以我使用这个正则表达式:

^{pr2}$

这将产生以下输出:

[('pizza', 'garlic', 'jam')]

现在,我需要的是课文中这些词相互接近的部分。我试着标记文本,并在列表中反复查看单词是否在每个句子中,并将其打印出来,但这会在文本开头捕捉到错误的“jam”。这不是我需要的-我只需要包含所有三个单词彼此靠近的那部分文本。在

一旦在课文中发现这三个词很接近,有没有什么方法可以让你在前面说10个词,在后面说10个词?或者我怎样才能得到包含这些单词的句子(而不是包含它们但不相关的句子,比如本文的第一个句子)?在


Tags: andofthe文本asall单词like
1条回答
网友
1楼 · 发布于 2024-04-24 21:22:27

对于这样的问题,你需要确保你有3个词在你的匹配,这应该是最小的长度。用于问题的第一部分,我们需要一个模式来匹配我们的单词和其他单词的任何组合,而且它必须包含所有单词,因此您不能做如下操作:

(pizza|garlic|jam).*?(pizza|garlic|jam).*?(pizza|garlic|jam)

因为它将与jam ...pizza...jam匹配。您需要为正则表达式创建所有可以用itertools.permutations完成的可能性,因此必须选择以下一种情况:

^{pr2}$

注意在前面的组中,由于您希望最小匹配,因此您必须在句子的前导和尾随中各有一个单词(因为如果您有另一个单词,那么在这个句子中它的冗余考虑(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

相关问题 更多 >