Python - 更好地处理多个str.replace调用?

时间:2013-12-04 18:12:52

标签: python string replace

我经常发现自己在大量文本中漫游,提取术语或以其他方式清理东西,所以我重新使用字符串作为文件名等。

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

我可以从html中获取标题,但标题中通常会使用非法获胜的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的堆,不太可读或无法管理。

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

你对此有什么看法?

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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)

我认为会起作用....

答案 2 :(得分:1)

我想,上一个问题的回答对你来说很有用。 Python replace multiple strings。这不是例外的答案,但它运作良好,并且功能很好。

答案 3 :(得分: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