我是Regex的新手。我有一个正则表达式,从字符串中删除重复的字符。
>>> self.repeat_regexp = re.compile(r'(\w*)(\w)\2(\w*)')
>>> self.repl = r'\1\2\3'
以上两行代码剥离重复字符。例如,loooooooove
转到love
。
但是我想改变正则表达式模式,只有当重复的字符重复超过3次时才会替换它。预期产出:
cannot ---> cannot
loooooooove ----> love
我不明白正则表达式r'(\w*)(\w)\2(\w*)'
和r'\1\2\3'
如果以可理解的方式解释上述正则表达式将会有所帮助。
答案 0 :(得分:4)
我不懂正则表达式 - > r'(\ w *)(\ w)\ 2(\ w *)'和r'\ 1 \ 2 \ 3'如果上述正则表达式以可理解的方式解释将会有所帮助。
好的,我们走吧:
(\w*)
是任何类型的字符(字母,数字,下划线 - 根据区域设置而有所不同,可以包含带重音的法语字母),零次或多次(使用量词 *
)。
接下来,它会尝试仅匹配一个单词字符(\w)
- 然后再使用\2
再次匹配该字符,这是后引用到第二个匹配表达式,即之前匹配的\w
字符。
之后,再次出现零个或多个单词,与开头相同。
如果该表达式匹配,则self.repl = r'\1\2\3'
再次使用后引用替换它 - 使用搜索模式中的括号捕获子模式进行匹配。
所以每个匹配的部分都会被自己替换 - 除了重复的字符匹配\2
,它没有分组括号。
因此,如果您希望重复的char至少出现三次,则将表达式的那部分修改为(\w)(\2{2,})'
- {2,}
是另一个量词,表示“仅当前面的模式发生时才匹配至少两次“。 (只有至少两次,因为第一个字符已与之前的(\w)
匹配。)
虽然我没有使用前导和尾随(\w*)
来使用它 - 但由于它们也匹配零字符,我认为它们可以完全被抛弃。
所以这应该做你想要达到的目标:
self.repeat_regexp = re.compile(r'(\w)(\1{2,})')
self.repl = r'\1'
(由于我在这里删除了主要的捕获子模式,\2
被\1
替换,引用了现在的第一个捕获子模式。)