【问题标题】:Unescape _xHHHH_ XML escape sequences using PythonUnescape _xHHHH_ 使用 Python 的 XML 转义序列
【发布时间】:2009-06-23 03:39:47
【问题描述】:

我正在使用 Python 2.x [不可协商] 来读取 [由其他人创建的] XML 文档,这些文档允许许多元素的内容包含无效的 XML 字符,方法是使用 _xHHHH_ 约定转义它们,例如ASCII BEL aka U+0007 由 7 字符序列 u"_x0007_" 表示。无论是允许在文档中表示任何旧字符的功能还是转义方式都是不可协商的。我正在使用 cElementTree 或 lxml [semi-negotiable] 解析文档。

这是我尽可能高效地对解析器输出进行转义的最佳尝试:

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

通过观察典型文本中“_”的频率非常低,以及通过尽可能避免使用正则表达式设备,速度提高了一倍以上,因此上述情况有所偏差。

问题:有什么更好的想法吗?

【问题讨论】:

    标签: python xml escaping


    【解决方案1】:

    您不妨检查'_x' 而不仅仅是_,这并不重要,但肯定两个字符序列比单个下划线更罕见。除了这些细节,你似乎确实在利用糟糕的情况!

    【讨论】:

    • 检查 '_x' 的速度稍慢(Python 2.6),并且不适用于早于 2.3 的 Python。
    • 至于 Python 2.2 及更早版本,你是对的 @john - 我有点假设 x >= 3 (是否有人仍然坚持使用 Python 2.2...?!如果是这样,我'非常抱歉...!!!)。至于相对速度,这取决于您获得了多少孤立的'_',以及使用正则表达式检查的速度可能会减慢多少(根据我的经验,测试速度很快,但原始海报另有说明)——任何特定基准的 URL请问?
    猜你喜欢
    • 1970-01-01
    • 2018-06-27
    • 2018-05-21
    • 2011-06-25
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    相关资源
    最近更新 更多