我想从字符串中删除重复的字母,只要有更多的字母。例如,考虑下面的列表:
aaa --> it is untouched because all are the same letters
aa --> it is untouched because all are the same letters
a --> not touched, just one letter
broom --> brom
school --> schol
boo --> should be bo
gool --> gol
ooow --> should be ow
我使用以下正则表达式消除重复项,如下所示:
(?<=[a-zA-Z])([a-zA-Z])\1+(?=[a-zA-Z])
但是,字符串boo
中的操作失败,该字符串保留为原始boo
,而不是删除双o。同样的情况也发生在oow
上,它并没有减少到ow
你知道为什么正则表达式不使用boo
吗
正则表达式不匹配boo,因为它搜索的重复项前后至少有一个不同的字符
一种可能是制作一个更简单的正则表达式来捕获所有重复项,然后在结果是一个字符时恢复
下面是一个不带正则表达式的可能解决方案。它的速度更快,但它也将删除重复的空白和标点符号。不仅仅是信件
您可以将包含相同字符的整个单词匹配并捕获到一个捕获组中,然后在所有其他上下文中匹配重复的连续字母,并相应地替换:
见Python demo和regex demo
正则表达式详细信息
\b
-单词边界(([a-zA-Z])\2+)
-组1:一个ASCII字母(捕获到组2中),然后出现一个或多个相同的字母\b
-单词边界|
-或([a-zA-Z])
-组3:捕获到组3中的ASCII字母\3+
-组3中捕获的字母的一次或多次出现李>替换是组1和组3值的串联
要匹配任何Unicode字母,请将
[a-zA-Z]
替换为[^\W\d_]
相关问题 更多 >
编程相关推荐