我有一个巨大的字符串,我试图将其解析为字符串形式的一系列标记,我发现了一个问题:因为许多字符串都是相似的,有时执行 string.replace()
会导致先前替换的字符将被再次替换。
假设我要替换的字符串是“goto”,它被替换为“41”(十六进制)并转换为 ASCII(“A”)。稍后,字符串 'A' 也将被替换,因此转换后的 token 将再次被替换,从而导致问题。
让字符串只被替换一次的最佳方法是什么?将每个标记从原始字符串中分离出来并一次搜索它们需要很长时间
这是我现在的代码。虽然它或多或少起作用,但速度不是很快
# The largest token is 8 ASCII chars long
'out' is the string with the final outputs
while len(data) != 0:
length = 8
while reverse_search(data[:length]) == None:#sorry THC4k, i used your code
#at first, but it didnt work out
#for this and I was too lazy to
#change it
length -= 1
out += reverse_search(data[:length])
data = data[length:]
最佳答案
如果你想一次替换字符串,你可以使用字典:
translation = {'PRINT': '32', 'GOTO': '41'}
code = ' '.join(translation[i] if i in translation else i for i in code.split(' '))
基本上是 O(2|S|+(n*|dict|))。非常快。尽管内存使用量可能相当大。跟踪替换将使您能够在线性时间内解决问题,但前提是您排除查找先前替换的成本。总而言之,问题似乎本质上是多项式的。
除非python中有一个函数可以通过我不知道的字典翻译字符串,否则这个似乎是最简单的放置方式。
转身
10 PRINT HELLO
20 GOTO 10
进入
10 32 HELLO
20 41 10
我希望这与您的问题有关。
关于python - 如何保持替换字符串的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3534997/