【问题标题】:Can I do a number of string replace in one statement in python我可以在 python 的一个语句中进行多个字符串替换吗
【发布时间】:2011-09-15 08:55:05
【问题描述】:

我正在尝试使用以下语句在我的字符串中减少垃圾字符:

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

我可以将以上 3 个语句写成一个语句,还是将第一个两个语句写成一个语句。

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

编辑@unutbu:
我的字符串如下所示:

这是'“' my teststring '”'. 我想用适当的 HTML 替换 unicode,而不是只用 unicode 值替换整个字符串。

使用代码后:

import HTMLParser

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

我只得到 HTML 等价物,而不是字符串。但我只想替换适当的值,将所有内容保留在原始字符串中。

我希望输出如下:

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

【问题讨论】:

  • 是否“我不能在我的项目中使用任何第三方库。”意思是这是作业?如果是这样,请将其标记为这样。
  • @Duncan3,我正在使用 python 开发 Plex 插件,这将在嵌入式系统上运行。 Thatz Y 我不能使用第三方库

标签: python string replace


【解决方案1】:

HTMLParser 在标准库中:

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's answer

【讨论】:

  • 这很好,值得指出的是,它返回的字符与 OP 代码中给出的字符不同。
  • @unutbu,通过使用它,完整的字符串将被 HTML 字符替换。编辑了问题
  • @Subhen: 尝试将text='“ ” ·' 更改为text="This is “ my teststring ”. I want to replace..."
  • @subhen:'“' 周围有单引号吗?如果是这样,你最终会得到'“'
  • @Subhen: 或者使用desc=parser.unescape(desc)desc 替换为其非转义版本,而不是desc=parser.unescape(text)
【解决方案2】:

前两个你可以使用正则表达式一起做:

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)

【讨论】:

    【解决方案3】:

    我们现在可以从 Python 3.4 开始

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-01
      • 2021-10-06
      • 2019-04-15
      • 2019-07-23
      • 1970-01-01
      • 1970-01-01
      • 2010-12-12
      相关资源
      最近更新 更多