#python #regex #unicode #backslash
#python #регулярное выражение #юникод #обратная косая черта
Вопрос:
Я уже много читал о проблеме экранирования обратной косой черты в строках python (и распознавания обратной косой черты в Python в разных кодировках) и использовании обратной косой черты в регулярных выражениях, но все еще не могу решить свою проблему. Я был бы очень признателен за любую помощь (ссылки, примеры кода и т. Д.).
Я пытаюсь заменить шестнадцатеричные коды в строках определенными элементами из словаря с помощью re. Коды имеют тип ‘ uhhhh’, где hhhh — шестнадцатеричное число.
Я выбираю строки из таблицы sqlite3; по умолчанию они считываются как unicode, а не как «необработанные» строки unicode.
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 hereu201d 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 обрабатывать текст как необработанную строку Unicode (чтобы обратные косые черты обрабатывались буквально, а не как escape-символы). Я также попытался использовать re.escape(текст) и установить re.UNICODE, но в моем случае это не помогает.
Я использую Python 2.7.2.
Какие решения можно найти для этой проблемы?
Редактировать:
я действительно нашел возможное решение этой проблемы в StandardEncodings и PythonUnicodeIntegration, применив следующую кодировку для ввода:
text.encode('unicode_escape')
Есть ли что-нибудь еще, что нужно сделать?
Комментарии:
1. []u[0-9a-fA-F]{,4} != [] u[0-9a-fA-F]{0,4}
2. извините, запятой там быть не должно: []u[0-9a-fA-F]{4}
3. Можете ли вы просто опубликовать наименьший возможный объем кода, который воспроизводит ошибку между строкой ввода и желаемым результатом?
4. @npobedina. Вы действительно получаете строки во всех трех форматах, которые вы показали? Если это так, то это ошибка, которую необходимо исправить, прежде чем решать проблему декодирования ссылок entity / char.
5. на самом деле у меня есть строки только формата text3 , что вызвало мою проблему (другие строки, которые я добавил в качестве примеров). но, следуя совету @FailedDev, я отредактирую сообщение с более коротким фрагментом кода и более четкой задачей 🙂
Ответ №1:
Пример текста не содержит обратной косой черты. Это u201c
просто способ представления символа Юникода:
>>> text = u'Try u201cquotated text should be hereu201d try'
>>> '\' in text
False
>>> print text
Try “quotated text should be here” try
Регулярное выражение здесь на самом деле не требуется. Просто переведите целевые символы Юникода по желанию:
>>> table = {0x201c: u'"', 0x201d: u'"'}
>>> text.translate(table)
u'Try "quotated text should be here" try'
Комментарии:
1. большое спасибо! это делает именно то, что мне нужно. Я просто был одержим регулярным выражением и не мог думать ни о чем другом =)