如何在python中将多个连续重复字符替换为1个字符?

时间:2017-10-12 04:07:46

标签: python string

我在python中有一个字符串,我想将多个连续重复字符替换为1。 例如:

AppButtonProps

但是这个命令似乎没有用,请任何人帮忙找出这个命令有什么问题吗?

还有一种方法可以解决这个问题,但是想了解为什么上面的命令失败了,有没有办法纠正它:

st = "UUUURRGGGEENNTTT"
print(st.replace(r'(\w){2,}',r'\1'))

3 个答案:

答案 0 :(得分:3)

你需要使用正则表达式。 所以你可以这样做:

import re

re.sub(r'[^\w\s]|(.)(?=\1)', '', 'UUURRRUU')

结果是UR。

这是我所得到的快照:

enter image description here

这个正则表达式:(.)(?=.*\1)

(.) means: match any char except new lines (line breaks)
?=. means: lookahead every char except new line (.) 
* means: match a preceding token
\1 means: to mach the result of captured group, which is the U or R ...

然后用''

替换所有匹配

你也可以检查一下: lookahead

还检查这个工具我用它来解决我的正则表达式, 它描述了一切,你可以从中学到很多东西: regexer

答案 1 :(得分:2)

您的代码无效的原因是因为str.replace不支持正则表达式,您只能用另一个字符串替换子字符串。如果要通过匹配正则表达式模式替换,则需要使用re模块。

其次,你的正则表达式模式也是错误的,(\w){2,}将匹配任何出现2次或更多次的字符(虽然不一定是相同的字符),所以它不起作用。你需要做这样的事情:

import re
st = "UUUURRGGGEENNTTT"
print(re.sub(r'(\w)\1+',r'\1', st)))
# URGENT

现在这只会匹配相同的字符2次或更多次。

另一种“独特”解决方案是,您可以使用unique_justseen提供的itertools食谱:

from itertools import groupby
from operator import itemgetter

st = "UUUURRGGGEENNTTT"
new ="".join(map(next, map(itemgetter(1), groupby(st))))

print(new)
# URGENT

答案 2 :(得分:1)

string.replace(s, old, new[, maxreplace])只进行子串替换:

>>> '(\w){2,}'.replace(r'(\w){2,}',r'\1') 
'\\1'

这就是它失败的原因,它无法使用正则表达式,因此无法纠正第一个命令。