我发现了一个从网络上获取的Python代码片段,可以通过正则表达式去除重复连续字符并保留第一个字符,如下:
import re
re.sub(r'(?s)(.)(?=.*\1)','','aabbcc') #'abc'
但存在一个缺陷,如果字符串是'aabbccaabb',它将忽略第一个'aa'和'bb',输出结果为'cab'。
re.sub(r'(?s)(.)(?=.*\1)','','aabbccaabb') #'cab'
有没有用正则表达式解决这个问题的方法?
使用列表推导式和条件来检查前一个字符是否与当前字符相同,而不使用正则表达式,并连接结果:
s='aabbccaabb'
print("".join([c for i,c in enumerate(s) if i==0 or s[i-1]!=c]))
只需去掉正向先行断言中的.*
。
import re
print re.sub(r'(?s)(.)(?=\1)','','aabbcc')
print re.sub(r'(?s)(.)(?=\1)','','aabbccaabb')
输出:
abc
abcab
re.sub(r'(?s)(.)\1', r'\1', 'aabbccaabb')
: - Scott Carpenterre.sub(r'(.)\1+', r'\1', 'aaabbccaabb')
这个会起作用。 - Mohammad Yusuf
z=list(s); t="".join([u for u,v in zip(z,['']+z)if u!=v])
。这避免了循环中的双重测试,但代价是将字符串转换为列表并创建第二个列表,尽管大部分工作都以C速度完成,因此非常快。如果我们知道s
永远不会以NUL字符开头,我们可以通过t="".join([u for u,v in zip(s,'\0'+s)if u!=v])
来避免转换为列表,但我想那有点笨拙。 ;) - PM 2Rings[0]+"".join([c for i,c in enumerate(s[1:]) if s[i]!=c])
。 - Jean-François Fabreuvloop
很不错 :) - Mohammad Yusuf