Python - handling multiple str.replace calls better?
本问题已经有最佳答案,请猛点这里访问。
我经常发现自己在大量文本中徘徊,提取术语或进行其他清理工作,因此我将字符串重新用作文件名或类似名称。
在最近的任务中,我从一个网站上获取了几百个pdf文件,并希望使用文章标题作为文件名来帮助我的同事检入这些文件。
我可以从html中获取标题,但是标题中经常使用非法的Win O / S字符(例如
由于上述原因,我开始使用以下代码行:-
1 | fname = art_number+""+content_title.replace(":"," -").replace("–","-").replace(u'\xae',"-").replace(""","").replace("?","").replace("","").replace("","").replace("/","").replace("-< sup>","-") |
如你看到的。
通常,每个替换项都是手动考虑的,我不想将它们扔到代码簿中,因为通常我想查找和检查的每组内容都有细微差别。
您将如何处理?
对于单字符替换,我将使用
对于更长的字符串,我将构建一个由前两个字符索引的可能替换的字典,然后逐步进行字符串测试,仅在每个位置测试可能的替换。
您可以使用
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 =":","–",... def replacer(match): return { "–":"-", ":":"-", ... }[match.group(0)] re.sub("|".join("(%s)"%k for k in sorted(keys,key=len,reverse=True)),replacer,my_text) |
我认为会工作....