Массовую строку заменить в питоне? - PullRequest
42 голосов
/ 17 декабря 2009

Скажем, у меня есть строка, которая выглядит следующим образом:

str = "The &yquick &cbrown &bfox &Yjumps over the &ulazy dog"

Вы заметите множество мест в строке, где есть амперсанд, за которым следует символ (например, "& y" и "& c"). Мне нужно заменить эти символы подходящим значением, которое у меня есть в словаре, например так:

dict = {"&y":"\033[0;30m",
        "&c":"\033[0;31m",
        "&b":"\033[0;32m",
        "&Y":"\033[0;33m",
        "&u":"\033[0;34m"}

Какой самый быстрый способ сделать это? Я мог бы вручную найти все амперсанды, а затем перебрать словарь, чтобы изменить их, но это кажется медленным. Выполнение множества замен регулярных выражений также кажется медленным (у меня в моем коде будет словарь из 30-40 пар).

Любые предложения приветствуются, спасибо.

Edit:

Как отмечалось в комментариях к этому вопросу, мой словарь определен до времени выполнения и никогда не изменится в течение жизненного цикла приложений. Это список управляющих последовательностей ANSI, в котором будет около 40 элементов. Моя средняя длина строки для сравнения будет около 500 символов, но будут и те, которые до 5000 символов (хотя, они будут редкими). Я также использую Python 2.6 в настоящее время.

Редактировать # 2 Я принял ответ Tor Valamos как правильный, поскольку он не только дал правильное решение (хотя это не было best решение), но принял во внимание все остальные и проделал огромную работу для сравнения все они. Этот ответ - один из лучших, самых полезных ответов, которые я когда-либо встречал на StackOverflow. Слава тебе.

Ответы [ 13 ]

1 голос
/ 17 декабря 2009

Не уверен насчет скорости этого решения, но вы можете просто просмотреть свой словарь и несколько раз вызвать встроенный

str.replace(old, new)

Это может работать неплохо, если исходная строка не слишком длинная, но, очевидно, пострадает, когда строка станет длиннее.

0 голосов
/ 01 апреля 2015

попробуйте

tr.replace ( "& у", ДИКТ [ "& у"])

tr.replace ( "& C", ДИКТ [ "& C"])

tr.replace ( "& B", ДИКТ [ "& Ь"])

tr.replace ( "& Y" ДИКТ [ "& Y"])

tr.replace ( "& U", ДИКТ [ "& U"])

0 голосов
/ 17 декабря 2009
>>> a=[]
>>> str = "The &yquick &cbrown &bfox &Yjumps over the &ulazy dog"
>>> d={"&y":"\033[0;30m",                                                              
... "&c":"\033[0;31m",                                                                 
... "&b":"\033[0;32m",                                                                 
... "&Y":"\033[0;33m",                                                                 
... "&u":"\033[0;34m"}     
>>> for item in str.split():
...  if item[:2] in d:
...    a.append(d[item[:2]]+item[2:])
...  else: a.append(item)
>>> print ' '.join(a)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...