我可以在Python中一次性替换多个字符串吗
我正在尝试用以下语句去掉我字符串中的一些杂乱字符:
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 个回答
从Python 3.4开始,我们现在可以这样做:
import html
text='“ ” ·'
desc=html.unescape(text)
print(desc) # “ ” ·
前两个你可以用正则表达式一起处理:
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)
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
也会替换 <
、>
和 &
。如果你只想替换 “
、”
和 ·
,那么我建议你参考 aix 的回答。