Я уже много читал о проблеме экранирования обратной косой черты в строках Python (и распознавания обратной косой черты в Python в различных кодировках) и использования обратной косой черты в регулярных выражениях, но все еще не могу решить мою проблему.Я был бы очень признателен за любую помощь (ссылки, примеры кода и т. Д.).
Я пытаюсь заменить шестнадцатеричные коды в строках определенными элементами из словаря, используя re .Коды имеют тип '\ uhhhh' , где hhhh - шестнадцатеричное число.
Я выбираю строки из таблицы sqlite3;по умолчанию они читаются как юникод, а не как «сырые» строки юникода.
import re
pattern_xml = re.compile(r"""
(.*?)
([\\]u[0-9a-fA-F]{4})
(.*?)
""", re.VERBOSE | re.IGNORECASE | re.DOTALL)
uni_code=['201C','201D']
decoded=['"','"']
def repl_xml(m):
item=m.group(2)
try: decodeditem=decoded[uni_code.index(item.lstrip('\u').upper())]
except: decodeditem=item
return m.group(1) + "".join(decodeditem) + m.group(3)
#input
text = u'Try \u201cquotated text should be here\u201d try'
#text after replacement
decoded_text=pattern_xml.subn(repl_xml,text)[0]
#desired outcome
desired_text=u'Try "quotated text should be here" try'
Итак, я хочу, чтобы _decoded_text_ был равен _desired_text _.
Мне не удалось заменить одиночный обратный слеш двойным обратным слешем или заставить python обрабатывать текст как необработанную строку в Юникоде (чтобыобратная косая черта трактуется буквально, а не как escape-символы).Я также попытался использовать re.escape (текст) и установить re.UNICODE, но в моем случае это не помогает.
Я использую Python 2.7.2.
Какие решения можно найти для этой проблемы?
Редактировать:
Я действительно нашел возможное решение этой проблемы на StandardEncodings и PythonUnicodeIntegration, применив следующую кодировку к input :
text.encode('unicode_escape')
Есть что-нибудь еще сделать?