如何在Python中将重复的字符替换为单个字符实例

28 投票
11 回答
33261 浏览
提问于 2025-04-16 05:07

我想把字符串中重复的 "*" 字符替换成一个单独的 "*"。比如,如果字符串是 "***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会返回输入字符串的引用,这样可以减少对你电脑的负担,而不是创建一个全新的字符串。

撰写回答