我在python中有一个字符串,我想将多个连续重复字符替换为1。 例如:
AppButtonProps
但是这个命令似乎没有用,请任何人帮忙找出这个命令有什么问题吗?
还有一种方法可以解决这个问题,但是想了解为什么上面的命令失败了,有没有办法纠正它:
st = "UUUURRGGGEENNTTT"
print(st.replace(r'(\w){2,}',r'\1'))
答案 0 :(得分:3)
你需要使用正则表达式。 所以你可以这样做:
import re
re.sub(r'[^\w\s]|(.)(?=\1)', '', 'UUURRRUU')
结果是UR。
这是我所得到的快照:
这个正则表达式:(.)(?=.*\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'
这就是它失败的原因,它无法使用正则表达式,因此无法纠正第一个命令。