【问题标题】:Python - handling multiple str.replace calls better? [duplicate]Python - 更好地处理多个 str.replace 调用? [复制]
【发布时间】:2013-12-21 09:01:14
【问题描述】:

我经常发现自己在大量文本中徘徊,提取术语或以其他方式清理内容,因此我将字符串重新用作文件名等。

在最近的一项任务中,我从一个网站上抓取了几百个 pdf 文件,并想使用文章标题作为文件名,以帮助我的同事检查文件。

我可以从 html 中获取标题,但标题中经常使用非法的 win O/S 字符(例如 :"> 等),这意味着我必须做一些替换确保我可以使用标题。

由于上述原因,我开始使用这行代码:-

fname = art_number+" "+content_title.replace(":", " -").replace("&#8211;", "-").replace(u'\xae', "-").replace("\"", "").replace("?","").replace("<i>", "").replace("</i>", "").replace("/", " ").replace("<sup>-< sup>", "-")

如您所见。一堆str.replace,可读性和管理性都不是很好。

每个替换项通常都是手动考虑的,我不想将它们扔到代码书中,因为我想要查找和检查的每组内容通常都有一些细微差别。

您对此有何看法?

【问题讨论】:

  • 至少考虑建立一个查找表而不是一个大链......并且可能利用re.sub
  • @JonClements 我已经为较大的项目建立了查找 - 这个项目一开始只有两个替换然后弹出。 re.sub的优势是什么?

标签: python string replace


【解决方案1】:

您可以使用reduce() 和一系列替换对:

from functools import reduce

replacements = (":", " -"), ("a", "1"), ("b", "2"), ("c", "3")
content_title = "Testing: abc"
print reduce(lambda s, args: s.replace(*args), replacements, content_title)

输出:

Testing - 123

【讨论】:

    【解决方案2】:
    import re
    keys = ":","&#8211;",...
    def replacer(match):
        return {
           "&#8211;": "-",
           ":":"-",
            ...
        }[match.group(0)]
    
    re.sub("|".join("(%s)"%k for k in sorted(keys,key=len,reverse=True)),replacer,my_text)
    

    我认为可行....

    【讨论】:

    • 前提是好的——尽管有几点:在元素上使用re.escape,因为其中一些可能会影响未转义的正则表达式的操作——你错过了key=reverse=对于sortedreplacer 函数将接收匹配对象,而不是字符串...
    【解决方案3】:

    我认为这个来自上一个问题的答案对你很有效。 Python replace multiple strings。这不是一个例外的答案,但它运作良好并且是一个不错的小功能。

    【讨论】:

      【解决方案4】:

      对于单字符替换,我会使用unicode.translate

      对于更长的字符串,我会构建一个由前导两个字符索引的可能替换的字典,然后逐步测试字符串,仅测试每个位置的可能替换。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-11
        • 1970-01-01
        • 1970-01-01
        • 2018-10-09
        • 1970-01-01
        • 1970-01-01
        • 2018-10-26
        • 2017-08-04
        相关资源
        最近更新 更多