用于在Python中重复字符串中的字符的正则表达式

时间:2013-03-21 10:06:45

标签: regex python-2.7

我是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' 如果以可理解的方式解释上述正则表达式将会有所帮助。

1 个答案:

答案 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替换,引用了现在的第一个捕获子模式。)