как вести подсчет замененных строк - PullRequest
2 голосов
/ 21 августа 2010

У меня есть массивная строка, которую я пытаюсь проанализировать как серию токенов в строковой форме, и я обнаружил проблему: поскольку многие строки похожи, иногда выполнение string.replace() приводит к повторной замене ранее замененных символов. 1002 *

скажем, у меня есть заменяемая строка 'goto', она заменяется на '41' (hex) и преобразуется в 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 голос
/ 22 августа 2010

Если вы пытаетесь заменить строки сразу, вы можете использовать словарь:

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

Надеюсь, это как-то связано с вашей проблемой.

...