我可以在Python中一次性替换多个字符串吗

2 投票
3 回答
960 浏览
提问于 2025-04-17 02:21

我正在尝试用以下语句去掉我字符串中的一些杂乱字符:

desc = string.replace(desc,'“','"')
desc = string.replace(desc,'”','"')
desc = string.replace(desc,'·','.') 

我能不能把上面的三条语句合成一条,或者至少把前两条合成一条呢?

在我的项目中,我不能使用任何第三方库。

编辑 @unutbu:
我的字符串看起来是这样的:

这是 '“' 我的测试字符串 '”'。 我想用合适的HTML替换unicode,而不是替换整个字符串,只替换unicode值。

在使用了以下代码后:

import HTMLParser

text='“ ” ·'
parser=HTMLParser.HTMLParser()
desc=parser.unescape(text)

我只得到了HTML的对应值,而不是字符串。但我只想替换合适的值,保持原字符串的其他部分不变。

我希望输出结果如下:

这是 "我的测试字符串"。我想用合适的HTML替换unicode,而不是替换整个字符串,只替换unicode值。

3 个回答

0

从Python 3.4开始,我们现在可以这样做:

import html
text='“ ” ·'
desc=html.unescape(text)
print(desc)  # “ ” ·
3

前两个你可以用正则表达式一起处理:

desc = re.sub('&[rl]dquo;', '"', desc)

如果你预计会有很多这样的模式,可以把它们放进一个字典里,然后用循环来处理:

patterns = {'&[rl]dquo;': '"',
            '·':   '.'}

for pattern, repl in patterns.items():
    desc = re.sub(pattern, repl, desc)

和你原来的代码一样,这种方法在处理较长的 desc 时效率不高,因为它会多次扫描字符串。这里有一个可以扩展的版本,只需扫描字符串一次:

import re

subs = {'rdquo':  '"',
        'ldquo':  '"',
        'middot': '.'}

def repl(matchobj):
  return subs.get(matchobj.group(1), matchobj.group(0))

desc = 'sdf sdfs “ sdf sd “ skdfh · sdf &nonsub; jk'
print re.sub('&(.*?);', repl, desc)
4

HTMLParser 是 Python 标准库中的一个模块:

import HTMLParser

text='“ ” ·'
parser=HTMLParser.HTMLParser()
desc=parser.unescape(text)
print(desc)
# “ ” ·

如果你想用一句话来实现这个功能,当然可以这样做:

desc=HTMLParser.HTMLParser().unescape(text)

不过,如果你需要在多个地方调用 unescape,这样做可能就不太方便了。而且,像这样把多个调用连在一起,会让你更难找到出错的地方。

需要注意的是,HTMLParser.unescape 会把 所有htmlentitydefs.names2codepoint 中定义的 HTML 实体(还有 ')都转换回来。


补充:HTMLParser.unescape 返回的字符和你发的不同。如果你想得到完全相同的字符,可以使用 xml.sax.saxutils

text='“ ” ·'
import xml.sax.saxutils as saxutils
print(saxutils.unescape(text,{'“':'"', '”':'"', '·':'.', }))
# " " .

需要注意的是,saxutils.unescape 也会替换 <>&。如果你只想替换 “”&middot,那么我建议你参考 aix 的回答

撰写回答