我有一个巨大的字符串我试图以字符串形式解析为一系列令牌,我发现了一个问题:因为许多字符串是相似的,有时候执行string.replace()
会导致先前替换的字符再次被替换
说我要替换的字符串是'goto'并且它被'41'(十六进制)替换并转换为ASCII('A')。稍后,字符串'A'也将被替换,以便转换后的令牌再次被替换,从而导致问题。
什么是让字符串只被替换一次的最佳方法?打破原始字符串中的每个标记并一次搜索一个标记需要很长时间
这是我现在的代码。虽然它或多或少有效,但不是很快
# 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:]
答案 0 :(得分:1)
如果您尝试一次替换字符串,可以使用字典:
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
我希望这与你的问题有关。