2013-03-22 3 views
-1

Рассмотрим следующие замены строки кода Python:Быстрее замена строки в Python

import re 

s = 'head abc.sys!0x1234 middle defg.sys!0x1a2b tail' # this could be potentially very long 

d = {'0x1234' : 'Iamshorter', 
    '0x1a2b' : 'Iammuchlonger' } 

pat = re.compile(r'(\w+.\w+)!(0x[\d\w]+)') 

while True: 
    m = pat.search(s) 
    if not m: 
     break 
    module, addr = m.groups() 
    start, end = m.span() 
    s = s[:start] + '%s!%s' % (module, d[addr]) + s[end:] 

print s 

Это выход

head abc.sys!Iamshorter middle defg.sys!Iammuchlonger tail 

Ищу быстрее питона идиомы таким образом, что сила регулярного выражения питона может быть развязана. Я попытался использовать re.sub(), но мне было трудно сделать «repl» как функцию согласованной строки. Любое предложение очень ценится. Благодарю.

+0

Вы уже скомпилировали свое выражение. Вероятно, вы не получите больше сока из алгоритма поиска. Возможно, вам нужно будет искать свою высокую производительность на языках более низкого уровня, таких как C, чтобы писать четный «сырой» и более быстрый шаблон соответствия. – 2013-03-22 23:55:36

+2

Главный вопрос - почему вы ищете более быстрое решение. Упреждающая оптимизация во многих случаях переоценивается и делает ваш код чрезмерно сложным. – eandersson

+0

@eandersson: Я разместил это как запрос на все, что я мог бы не знать, например, как мы правильно используем встроенные модули, чтобы я мог учиться у эксперта. Этот код не нужно оптимизировать, так как это просто мой скрипт, выполняющий замену подстроки. Я очень хочу учиться у экспертов python; Я не знаю, почему кто-то дал мне нить. :( –

ответ

0

Единственное, что я хотел бы сделать, это использовать необязательный параметр «pos» для search function, чтобы вы не проверяли ту часть строки, которую вы уже проверили.

Смежные вопросы