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)'
要么返回一个固定宽度的问题(当我保留+)或其他一些问题.
我应该如何纠正负面的背后?
也许根本不需要正则表达式。
使用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)
| 归档时间: |
|
| 查看次数: |
250 次 |
| 最近记录: |