Я использую Python 2.x [не подлежит обсуждению] для чтения документов XML [созданных другими], которые позволяют содержанию многих элементов содержать символы, которые не являются допустимыми символами XML, путем их экранирования с использованием соглашения _xHHHH_
, например ASCII BEL aka U + 0007 представлен 7-символьной последовательностью u"_x0007_"
. Ни функциональность, которая допускает представление любого старого символа в документе, ни способ экранирования не подлежит обсуждению. Я анализирую документы, используя cElementTree или lxml [полу-договорный].
Вот моя лучшая попытка максимально эффективно отменить вывод парсера:
import re
def unescape(s,
subber=re.compile(r'_x[0-9A-Fa-f]{4,4}_').sub,
repl=lambda mobj: unichr(int(mobj.group(0)[2:6], 16)),
):
if "_" in s:
return subber(repl, s)
return s
Вышесказанное смещено при наблюдении очень низкой частоты "_" в типичном тексте и скорости, превосходящей удвоение, при возможности избегая использования устройства регулярных выражений.
Вопрос: есть идеи получше?