python - 删除重复的字母,缩写除外
问题描述
只要有更多字母,我想从字符串中删除重复的字母。例如,考虑以下列表:
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
不被正则表达式采用吗?
解决方案
您可以将由相同字符组成的整个单词匹配并捕获到一个捕获组中,然后在所有其他上下文中匹配重复的连续字母,并相应地替换:
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.
正则表达式详细信息
\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_]
.
推荐阅读
- python - pandas 中的“复制”参数是否按预期工作?
- python - 尝试连接到 API 并打开 MySQL 端口以便它可以工作,但终端只是挂起
- javascript - 使用javascript从表中删除列
- java - 如何在 Quartz Scheduler 中使用 JDBC 作业存储
- reactjs - 使用 react-window 防止 DOM 元素在虚拟化树组件中重新渲染
- php - Codeigniter 中的会话有什么问题?
- php - 使用 PHP 在 mysql 表中添加数据时出错
- oracle12c - 将行转置到转置列基于另一列发生变化的列
- javascript - Vuejs如何创建一个新数组以传递给图形
- python - 为什么中介中心性的 Networkx 输出是错误的?