После нахождения самого быстрого алгоритма замены строк в этой теме я пытался изменить один из них в соответствии со своими потребностями, в частности этот от gnibbler.
Я еще раз объясню здесь проблему, и что у меня за проблема.
Скажем, у меня есть строка, которая выглядит следующим образом:
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"}
Используя решение gnibblers, предоставленное в моей предыдущей теме, я использую это в качестве текущего решения:
myparts = tmp.split('&')
myparts[1:]=[dict.get(x[0],"&"+x[0])+x[1:] for x in myparts[1:]]
result = "".join(myparts)
Это работает для правильной замены символов и не сбой для символов, которые не найдены. Единственная проблема в этом состоит в том, что не существует простого способа на самом деле сохранить амперсанд на выходе. Самым простым способом, которым я мог бы придумать, было бы изменить мой словарь на:
dict = {"y":"\033[0;30m",
"c":"\033[0;31m",
"b":"\033[0;32m",
"Y":"\033[0;33m",
"u":"\033[0;34m",
"&":"&"}
И измените мой вызов "split", чтобы разделить регулярные выражения для амперсандов, за которыми НЕ следуют другие амперсанды.
>>> import re
>>> tmp = "&yI &creally &blove A && W &uRootbeer."
>>> tmp.split('&')
['', 'yI ', 'creally ', 'blove A ', '', ' W ', 'uRootbeer.']
>>> re.split('MyRegex', tmp)
['', 'yI ', 'creally ', 'blove A ', '&W ', 'uRootbeer.']
По сути, мне нужно регулярное выражение, которое разделится на первый амперсанд пары и каждый одиночный амперсанд, чтобы я мог выйти из него через мой словарь.
Если у кого-нибудь есть более удачные решения, пожалуйста, сообщите мне.