我有以下字符串: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."现在,我要确定“果酱”,“比萨饼”和“大蒜”这三个词彼此靠近的位置。所以我用这个正则表达式:fav_food = re.findall(r"\b(?:(?:((?i)pizza|pasta)|((?i)mint|garlic)|((?i)jam|jelly)|(?(1)|(?(2)|(?(3)|(?!))))\w+)\b\W*?){3,25}(?(1)(?(2)(?(3)|(?!))|(?!))|(?!))", text)这给出以下输出:[('pizza', 'garlic', 'jam')]现在,我需要的是这些词彼此接近的文本部分。我尝试对文本进行标记,然后遍历列表以查看每个句子中是否都包含该单词,然后进行打印,但这会在文本开头捕获错误的“果酱”。那不是我所需要的-我只需要包含所有3个彼此靠近的单词的文字部分。一旦在文本中找到了附近的3个单词,是否有某种方法可以说10个单词之前和之后的10个单词?或者我如何才能获得包含这些单词的句子(而不会获得包含这些单词但不相关的句子,例如本文中的第一句)? 最佳答案 对于这样的问题,您需要确保您的匹配项中包含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)请注意,在前面的组中,您需要最小的匹配,因此肯定要在句子的开头和结尾加上一个单词(因为如果您肯定有另一个单词,肯定会在此句子中考虑多余的this is jam and pizza and garlic 是多余的),因此我们在这里创建了所有可能的方法来优化正则表达式以拒绝额外的搜索:>>> 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关于python - 正则表达式彼此接近3个单词。如何获得他们的背景?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29209088/
10-11 08:40