使用Python解码XML转义序列_xHHHH_

3
我正在使用Python 2.x [不可谈判] 来读取由他人创建的XML文档,这些文档允许许多元素的内容包含不是有效XML字符的字符,并通过使用_xHHHH_约定对它们进行转义,例如ASCII BEL(即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

你最好检查'_x'而不是只检查_,虽然这并没有太大关系,但两个字符的序列比单个下划线更少见。除了这些细节之外,你似乎正在尽力应对一个糟糕的情况!


检查 '_x' 的速度稍慢(Python 2.6),并且在早于2.3的Python版本上无法工作。 - John Machin
关于Python 2.2及更早版本,你是对的@john--我有点假设x>=3(还有人被困在Python 2.2吗...?如果是这样,我非常抱歉...!!!)。至于相对速度,它取决于您获得了多少个孤立的'_'以及使用正则表达式进行了多少减速检查(根据我的经验,测试非常快,但原始帖子说不是这样)--请提供任何特定基准的URL? - Alex Martelli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接