【问题标题】:how to keep count of replaced strings如何保持替换字符串的数量
【发布时间】:2010-08-20 21:25:14
【问题描述】:

我有一个巨大的字符串,我试图将其解析为字符串形式的一系列标记,我发现了一个问题:因为许多字符串都是相似的,有时执行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:]

【问题讨论】:

  • 好吧,我完成了引发此问题的while True:string.replace() 循环。然后我尝试了“断开第一个令牌并替换它们,然后转到下一个令牌”的事情。它不像我希望的那样快,在某个地方,它仍然给我错误
  • 不懂 pyparsing 的人注定要重新发明它

标签: python parsing string str-replace


【解决方案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

我希望这与您的问题有关。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-31
    • 1970-01-01
    • 2011-10-23
    • 2020-07-09
    相关资源
    最近更新 更多