我是正则表达式的新手。我有一个正则表达式,可以从字符串中删除重复字符。
>>> 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*)'
and r'\1\2\3'
如果以可理解的方式解释上述正则表达式将会很有帮助。
我不明白正则表达式 --> r'(\w*)(\w)\2(\w*)' 和 r'\1\2\3' 如果将上述正则表达式解释为可以理解的方式。
好了,走吧:
(\w*)
是任何一种单词字符(字母、数字、下划线 - 根据区域设置而变化,可以包含带有重音符号的法语字母),零次或多次(通过使用量词 *
).
接下来,它尝试仅匹配一个单词字符(\w)
– 然后再次使用相同的字符\2
,这是一个反向参考到表达式中的第二个匹配项,即\w
之前匹配的字符。
之后,又是零个或多个单词字符,与开始时相同。
如果该表达式匹配,则self.repl = r'\1\2\3'
再次使用反向引用将其替换为所做的匹配捕获子模式在搜索模式中使用括号。
因此,每个匹配的部分都会被自身替换 - 除了重复的字符匹配之外\2
,它没有分组括号。
因此,如果您想让重复的字符至少出现三次,您可以将表达式的该部分修改为(\w)(\2{2,})'
– {2,}
是另一个量词,表示“仅当前面的模式出现至少两次时才匹配”。 (仅有的至少两次,因为第一个字符与前面的字符匹配(\w)
已经。)
我没有使用前导和尾随让它工作(\w*)
虽然 - 但由于这些也匹配零字字符,我认为它们可以完全被抛弃。
所以这应该可以实现您想要实现的目标:
self.repeat_regexp = re.compile(r'(\w)(\1{2,})')
self.repl = r'\1'
(因为我在这里删除了领先的捕获子模式,\2
被替换为\1
,引用现在第一个捕获子模式。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)