Unescape _xHHHH_ escape-последовательности XML с использованием Python - PullRequest
3 голосов
/ 23 июня 2009

Я использую 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

Вышесказанное смещено при наблюдении очень низкой частоты "_" в типичном тексте и скорости, превосходящей удвоение, при возможности избегая использования устройства регулярных выражений.

Вопрос: есть идеи получше?

1 Ответ

1 голос
/ 23 июня 2009

Вы можете также проверить '_x', а не просто _, это не будет иметь большого значения, но, несомненно, двухсимвольная последовательность будет еще реже, чем одиночное подчеркивание. Помимо таких деталей, вы, кажется, делаете лучшее из плохой ситуации!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...