【发布时间】:2010-12-27 12:09:57
【问题描述】:
假设我有一个如下所示的字符串:
str = "The &yquick &cbrown &bfox &Yjumps over the &ulazy dog"
您会注意到字符串中的很多位置都有一个 & 符号,后跟一个字符(例如“&y”和“&c”)。我需要用我在字典中的适当值替换这些字符,如下所示:
dict = {"&y":"\033[0;30m",
"&c":"\033[0;31m",
"&b":"\033[0;32m",
"&Y":"\033[0;33m",
"&u":"\033[0;34m"}
最快的方法是什么?我可以手动找到所有的 & 符号,然后遍历字典来更改它们,但这似乎很慢。做一堆正则表达式替换似乎也很慢(我的实际代码中会有大约 30-40 对的字典)。
任何建议都非常感谢,谢谢。
编辑:
正如 cmets 通过这个问题所指出的,我的字典是在运行时之前定义的,并且在应用程序生命周期的过程中永远不会改变。它是一个 ANSI 转义序列列表,其中包含大约 40 项。我要比较的平均字符串长度约为 500 个字符,但会有最多 5000 个字符的字符串(尽管这种情况很少见)。我目前也在使用 Python 2.6。
编辑#2 我接受 Tor Valamos 的回答是正确的,因为它不仅提供了一个有效的解决方案(尽管它不是 最佳 解决方案),而且还考虑了所有其他问题并做了大量工作比较所有这些。这个答案是我在 StackOverflow 上遇到过的最好、最有帮助的答案之一。向你致敬。
【问题讨论】:
-
正如 Tor Valamo 指出的那样,您可能还需要考虑错误情况——例如,如果您的字典中没有 & 符号序列,以及您在应该单独保留的字符串,因为它是文本内容的一部分。
-
Mike,除了知道整个字符串长度之外,了解转义序列的密度或每个字符串的总数或其他信息对于完整的基准测试也很重要。
-
Peter:这是不可预测的,因为有些字符串有 15 个字符和 15 个转义序列,有些字符串有 500 个字符和 1 个转义序列。字符串来自用户,因此可以是他们想要的任何东西。对于基准测试,我假设每 25 个常规字符有一个转义序列。
-
如果字符串来自用户,我会说错误处理有点好,是吗,彼得? :P
-
@Tor,当然,如果现在需要错误处理,那么可以提供它。如果“&W”也是转义码,则尚未定义在输入文本包含例如“A&W root beer”的情况下您想要做什么。
标签: python regex string performance replace