首页 > 解决方案 > 删除重复的字母,缩写除外

问题描述

只要有更多字母,我想从字符串中删除重复的字母。例如,考虑以下列表:

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不被正则表达式采用吗?

标签: pythonpython-3.xregexregex-lookarounds

解决方案


您可以将由相同字符组成的整个单词匹配并捕获到一个捕获组中,然后在所有其他上下文中匹配重复的连续字母,并相应地替换:

import re
text = "aaa, aa, a,broom, school...boo, gool, ooow."
print( re.sub(r'\b(([a-zA-Z])\2+)\b|([a-zA-Z])\3+', r'\1\3', text) )
# => aaa, aa, a,brom, schol...bo, gol, ow.

请参阅Python 演示正则表达式演示

正则表达式详细信息

  • \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_].


推荐阅读