关于字符串:Python-处理多个str.replace调用更好吗?

Python - handling multiple str.replace calls better?

本问题已经有最佳答案,请猛点这里访问。

我经常发现自己在大量文本中徘徊,提取术语或进行其他清理工作,因此我将字符串重新用作文件名或类似名称。

在最近的任务中,我从一个网站上获取了几百个pdf文件,并希望使用文章标题作为文件名来帮助我的同事检入这些文件。

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

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

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

如你看到的。 str.replace的堆,不是很容易阅读或管理的。

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

您将如何处理?


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

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


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

1
2
3
4
5
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)

输出:

1
Testing - 123


我认为,上一个问题的答案对您来说效果很好。 Python替换了多个字符串。 这不是一个例外的答案,但是它可以很好地工作并且具有很好的功能。


1
2
3
4
5
6
7
8
9
10
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)

我认为会工作....