2010-08-20 72 views
2

我有一个巨大的字符串我尝试解析为一系列字符串形式的令牌的数量,我发现了一个问题:因为许多串的都是一样的,有时做string.replace()将导致先前替换字符再次被替换。如何保持替换字符串

说我有字符串被替换为“转到”和它被由“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

很好,我已经做了'而真实:与string.replace()'循环,开始了这个问题。然后我尝试了'取消第一个标记并替换它们,然后转到下一个标记'的东西。它的速度并不像我想要的那样快,它仍然给我错误 – calccrypto 2010-08-20 21:31:59

+3

那些不知道pyparsing的人注定要重塑它 – 2010-08-20 21:32:22

+0

请提供更多示例 – leoluk 2010-08-21 00:40:59

回答

1

如果你想一次替换字符串,你可以使用字典:

translation = {'PRINT': '32', 'GOTO': '41'} 
code = ' '.join(translation[i] if i in translation else i for i in code.split(' ')) 

这基本上是Ø(2 | S | +(N * |字典|))。非常快。虽然内存使用量可能相当大。跟踪替代将允许您在线性时间内解决问题,但前提是您不包括查找以前替换的成本。总而言之,这个问题本质上似乎是多项式的。

除非有Python中的功能通过翻译,我不知道字典的字符串,这一次似乎是把它的最简单的方法。

它变成

10 PRINT HELLO 
20 GOTO 10 

10 32 HELLO 
20 41 10 

我希望这是与你的问题。