如何在Python中将重复的字符替换为单个字符实例
我想把字符串中重复的 "*"
字符替换成一个单独的 "*"
。比如,如果字符串是 "***abc**de*fg******h"
,我希望它变成 "*abc*de*fg*h"
。
我对 Python(以及编程)还很陌生,试着用正则表达式和 string.replace()
方法来做,像这样:
import re
pattern = "***abc**de*fg******h"
pattern.replace("*"\*, "*")
这里 \*
是用来替换所有的 "*" 字符的。但是我遇到了一个错误:SyntaxError: unexpected character after line continuation character(语法错误:行继续字符后出现意外字符)。
我还试着用 for 循环来处理,像这样:
def convertString(pattern):
for i in range(len(pattern)-1):
if(pattern[i] == pattern[i+1]):
pattern2 = pattern[i]
return pattern2
但是这样会出现一个问题,它只打印出一个 "*",因为 pattern2 = pattern[i]
不断重新定义 pattern2
的值……
任何帮助都会很感激。
11 个回答
8
我建议你使用re模块中的sub函数:
import re
result = re.sub("\*+", "*", "***abc**de*fg******h")
我强烈推荐你阅读一下关于正则表达式(RE)和一些好习惯的文章。如果你对这些不太熟悉,它们可能会让人感到困惑。实际上,使用原始字符串是个不错的选择。
11
有没有不使用正则表达式的方法呢?
def squeeze(char,s):
while char*2 in s:
s=s.replace(char*2,char)
return s
print(squeeze("*" , "AB***abc**def**AA***k"))
这样做会返回 AB*abc*def*AA*k
35
用re
模块来处理这种事情,最简单的方法是:
re.sub('\*+', '*', text)
这个方法会把连续出现的一个或多个星号替换成一个星号。对于只有一个星号的情况,这样做就像是拼命保持不变,实际上效率很低。更好的方法是把连续出现的两个或更多星号替换成一个星号:
re.sub('\*\*+', '*', text)
这样做是非常值得的:
\python27\python -mtimeit -s"t='a*'*100;import re" "re.sub('\*+', '*', t)"
10000 loops, best of 3: 73.2 usec per loop
\python27\python -mtimeit -s"t='a*'*100;import re" "re.sub('\*\*+', '*', t)"
100000 loops, best of 3: 8.9 usec per loop
需要注意的是,如果没有找到匹配的内容,re.sub会返回输入字符串的引用,这样可以减少对你电脑的负担,而不是创建一个全新的字符串。