我经常发现自己在大量文本中漫游,提取术语或以其他方式清理东西,所以我重新使用字符串作为文件名等。
在最近的一项任务中,我从网站上抓取了几百个pdf文件,并希望使用文章标题作为文件名来帮助我的同事检查文件。
我可以从html中获取标题,但标题中通常会使用非法获胜的O / S字符(例如:
,"
,>
等),这意味着我必须做一些替换,以确保我可以使用标题。
由于上述原因,我开始使用这行代码: -
fname = art_number+" "+content_title.replace(":", " -").replace("–", "-").replace(u'\xae', "-").replace("\"", "").replace("?","").replace("<i>", "").replace("</i>", "").replace("/", " ").replace("<sup>-< sup>", "-")
如你所见。 str.replace
的堆,不太可读或无法管理。
每个替换都是手动考虑的,我不想把它们放在代码簿中,因为我想要查找和检查每组内容通常有一些细微差别。
你对此有什么看法?
答案 0 :(得分:2)
对于单字符替换,我会使用unicode.translate
对于更长的字符串,我会构建一个由前两个字符索引的可能替换的字典,然后逐步测试每个位置可能替换的字符串。
答案 1 :(得分:1)
import re
keys = ":","–",...
def replacer(match):
return {
"–": "-",
":":"-",
...
}[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