如何统计替换的字符串次数
我有一个很长的字符串,想把它分解成一系列的标记(可以理解为小片段),但我遇到了一个问题:因为很多字符串看起来很相似,有时候用 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:]
1 个回答
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
希望这对你的问题有所帮助。