寻找连续重复单词时,Python后视正则表达式"固定宽度模式"错误

nac*_*cho 5 python regex negative-lookahead regex-lookarounds

我有一个单词分隔的文本.,有2个和3个连续重复单词的实例:

My.name.name.is.Inigo.Montoya.You.killed.my.father.father.father.Prepare.to.die-

我需要将它们与正则表达式独立匹配,不包括重复项的重复项.

因为有最大值 这连续3个重复的话

r'\b(\w+)\.+\1\.+\1\b'

成功捕获

father.father.father

但是,为了捕获2个连续重复的单词,我需要确保下一个和前一个单词不一样.我可以做一个负面的预测

r'\b(\w+)\.+\1(?!\.+\1)\b'

但我的尝试是消极的后视

r'(?<!(\w)\.)\b\1\.+\1\b(?!\.\1)'

要么返回一个固定宽度的问题(当我保留+)或其他一些问题.

我应该如何纠正负面的背后

Jea*_*bre 3

也许根本不需要正则表达式。

使用itertools.groupby就可以完成工作。它旨在对相同出现的连续项目进行分组。

  • 按单词分组(根据点分割后)
  • 转换为列表并发出一个tuple值,仅当长度> 1时才计数

像这样:

import itertools

s = "My.name.name.is.Inigo.Montoya.You.killed.my.father.father.father.Prepare.to.die"

matches = [(l[0],len(l)) for l in (list(v) for k,v in itertools.groupby(s.split("."))) if len(l)>1]
Run Code Online (Sandbox Code Playgroud)

结果:

[('name', 2), ('father', 3)]
Run Code Online (Sandbox Code Playgroud)

所以基本上我们可以用这个元组列表做任何我们想做的事情(例如根据出现的次数进行过滤)

奖励(因为我一开始误读了这个问题,所以我把它留在里面):从句子中删除重复项 - 按单词分组(根据点分割后),如上所示 - 仅获取返回值的键(值)在列表比较中(我们不需要这些值,因为我们不计数) - 用点连接回来

一行(仍在使用itertools):

new_s = ".".join([k for k,_ in itertools.groupby(s.split("."))])
Run Code Online (Sandbox Code Playgroud)

结果:

My.name.is.Inigo.Montoya.You.killed.my.father.Prepare.to.die
Run Code Online (Sandbox Code Playgroud)