【发布时间】:2018-01-02 05:21:00
【问题描述】:
我有一个文本,其中的单词由. 分隔,其中包含 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)'
返回一个固定宽度的问题(当我保留+ 时)或其他一些问题。
我应该如何纠正消极的后视?
【问题讨论】:
-
正如你已经说过的,如果匹配没有恒定的长度,你就不能使用lookbehinds。您可以使用
regex库,这是一个替代的正则表达式库,允许可变长度的后视。 -
可以用1个以上的点分隔部分吗?你用了
\.+,是有意的吗?见this demo,你在找这样的东西吗? -
如果只是从“multicates”
\b(\w+)(?:\.(\1)(?:\.\1)+|\.(\1))\b中识别重复项,第 3 组中的匹配项是重复项,第 2 组中的匹配项是捕获词的三倍或更多。
标签: python regex regex-lookarounds negative-lookahead