我正在尝试解析包含正则表达式的xml:
<conditions>
<condition pattern_matches="regex string"/>
</conditions>
但是,当正则表达式包含不安全的字符时,例如(<=a).*b$
,ElementTree会引发一个ParseError,指出xml在<
字符处的格式不正确,即使该字符在引号内。
我可以使用<
而不是<
然后解析后替换所有这些字符,但这会使复杂的正则表达式难以阅读,并且需要重写包含此类字符组合的正则表达式,以免创建误报,并加载原始xml文件,然后交换字符以保证其安全变化,只是为了之后立即交换它们似乎是不必要的cpu密集。
我该如何处理这个问题?这对ElementTree来说太复杂了还是我做错了什么?
答案 0 :(得分:1)
从XML规范要求<
必须转义为<
。每个理智的XML处理器都必须遵循规范。请参阅相关讨论:Invalid Characters in XML。
也就是说,如果使用诸如ElementTree
之类的XML处理器创建XML,它将为您处理转义和转义过程。例如,给定包含<
的纯正则表达式字符串,ElementTree
会自动将其替换为<
:
>>> from xml.etree import ElementTree as et
>>> root = et.Element("conditions")
>>> regex_str = "(<=a).*b$"
>>> sub = et.SubElement(root, "condition", attrib = {"pattern_matches": regex_str})
>>> et.tostring(root)
'<conditions><condition pattern_matches="(<=a).*b$" /></conditions>'
...并且在读取属性值后会自动将其替换为<
:
>>> sub.attrib["pattern_matches"]
'(<=a).*b$'