Python: замена некоторых сущностей Unicode сущностями из словаря - PullRequest
2 голосов
/ 28 октября 2011

Я уже много читал о проблеме экранирования обратной косой черты в строках 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')

Есть что-нибудь еще сделать?

1 Ответ

0 голосов
/ 28 октября 2011

Образец текста не содержит обратной косой черты. \u201c - это просто способ представления символа Юникода:

>>> text = u'Try \u201cquotated text should be here\u201d 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'
...