我是Regex的新手。我有一个正则表达式,可从字符串中删除重复的字符。
>>> self.repeat_regexp = re.compile(r'(\w*)(\w)\2(\w*)')
>>> self.repl = r'\1\2\3'
Run Code Online (Sandbox Code Playgroud)
上面的两行代码去除了重复的字符。例如,loooooooove转到love。
但是我想更改正则表达式模式,以便仅在重复字符重复3次以上时才替换它。预期产量:
cannot ---> cannot
loooooooove ----> love
Run Code Online (Sandbox Code Playgroud)
我不了解正则表达式r'(\w*)(\w)\2(\w*)' ,r'\1\2\3'
如果以一种易于理解的方式解释上述正则表达式会有所帮助。
我不了解正则表达式-> r'(\ w *)(\ w)\ 2(\ w *)'和r'\ 1 \ 2 \ 3'如果将上述正则表达式解释为可以理解的方式。
好的,我们走吧:
(\w*)是任何类型的单词字符(字母,数字,下划线-取决于语言环境设置,可以包含带有重音符号的法语字母),零次或多次(使用量词 *)。
接下来,它尝试仅匹配一个单词字符(\w),然后使用再次匹配该相同字符\2,这是对表达式中第二个匹配项(以前匹配的字符)的反向引用\w。
之后,再次使用零或多个单词字符,与开头相同。
如果该表达式匹配,则将其self.repl = r'\1\2\3'替换(再次使用反向引用),将其替换为使用搜索模式中的括号捕获子模式的匹配项。
因此,每个匹配的部分都将被自己替换-重复的字符match除外,该字符\2没有分组括号。
因此,如果要使重复的char至少出现3次,请将表达式的该部分修改为(\w)(\2{2,})'– {2,}是另一个量词,表示“仅在前面的模式发生至少2次时才匹配”。(至少两次,因为第一个字符已经与前面的字符匹配(\w)。)
虽然我没有使用前导和尾随它来工作(\w*)-但是由于它们也匹配零个字字符,因此我认为它们可以完全抛弃。
因此,这应该做您想要实现的目标:
self.repeat_regexp = re.compile(r'(\w)(\1{2,})')
self.repl = r'\1'
Run Code Online (Sandbox Code Playgroud)
(因为我在这里删除了主要的捕获子模式,所以\2替换为\1,引用了现在的第一个捕获子模式。)
| 归档时间: |
|
| 查看次数: |
4502 次 |
| 最近记录: |