2010-08-20 81 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 

我希望這是與你的問題。