regex 如何删除重复的字符,但继续?正则表达式Python

a7qyws3x  于 2023-08-08  发布在  Python
关注(0)|答案(2)|浏览(100)

我想删除重复的字符,但保留其中一个辅音字母的单词。
我写了下面的代码,但它删除了所有这些。

import re
text = "myyyy nname isss ssevvaall"
new = re.sub(r"([a-z])(\1{2,})","",text)

字符串
结果应为
我的名字是sevvaal

kdfy810k

kdfy810k1#

如果你想要va char的异常行为,那么使用这个正则表达式,

([^\W\d_va])(?=\1)

字符串
然后用空绳将其移除
这里[^\W\d_va]表示除va以外的所有字母
Demo where v and a letter is exempted
也可以将[^\W\d_va]写成[b-uw-zB-UW-Z]
如果你想在不使用lookahead的情况下以你的风格编写,你可以使用下面的regex,

([^\W\d_va])\1+


并将其替换为$1\1,其中正则表达式将匹配出现多次的字符,并将其替换为单个字符
Demo

jhkqcmku

jhkqcmku2#

基于字符集a-z,使用捕获组,您可以使用单个字符替换3个或更多连续字符,或者匹配2个连续的辅音,后面没有元音,然后替换为单个字符。
符号\1\2\3是匹配组中捕获的相同字符的反向引用。

([a-z])\1{2,}|([b-df-hj-np-tv-z])\2(?!([aeiou])\3)

字符串
模式匹配:

  • ([a-z])\1{2,}匹配3个或更多相同的连续字符,捕获组1中的第一个字符
  • |
  • ([b-df-hj-np-tv-z])\2匹配2个相同的辅音,捕获组2中的第一个
  • (?!([aeiou])\3)使用负前向Assert不2个相同的元音,捕获组3中的第一个

Regex demo

import re

text = "myyyy nname isss ssevvaall"
pattern = r"([a-z])\1{2,}|([b-df-hj-np-tv-z])\2(?!([aeiou])\3)"
new = re.sub(pattern, r"\1\2", text)
print(new)


产出

my name is sevvaal

相关问题