-2

[编辑]:

我知道正则表达式不是用来解析 XML 的,但我的问题是为什么在 Python 中不能编译正则表达式。

我期待关于在那个正则表达式中什么不起作用而不是为什么使用它不是一个好主意的答案(我不明白反对票)。

[/编辑]

我正在尝试根据此文档编写一个逃避 XML 标记竞争的函数,我认为最好的解决方案是逃避所有不在 CDATA 部分中的“<”和“&”。

我对正则表达式有基本的了解,所以我环顾四周,发现了这一页这一页。

显然,与“&”一起使用的正则表达式是:

&(?!(?:[a-zA-Z][a-zA-Z0-9]*|#\d+);)(?!(?>(?:(?!<!\[CDATA\[|\]\]>).)*)\]\]>)

但它在 python 中不起作用,事实上,如果我尝试使用它,我有:

In [1]: import re

In [2]: x = re.compile('&(?!(?:[a-zA-Z][a-zA-Z0-9]*|#\d+);)(?!(?>(?:(?!<!\[CDATA\[|\]\]>).)*)\]\]>)')
---------------------------------------------------------------------------
error                                     Traceback (most recent call last)
<ipython-input-2-2884ec1d2f4e> in <module>()
----> 1 x = re.compile('&(?!(?:[a-zA-Z][a-zA-Z0-9]*|#\d+);)(?!(?>(?:(?!<!\[CDATA\[|\]\]>).)*)\]\]>)')

/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/re.pyc in compile(pattern, flags)
    188 def compile(pattern, flags=0):
    189     "Compile a regular expression pattern, returning a pattern object."
--> 190     return _compile(pattern, flags)
    191 
    192 def purge():

/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/re.pyc in _compile(*key)
    243         p = sre_compile.compile(pattern, flags)
    244     except error, v:
--> 245         raise error, v # invalid expression
    246     if len(_cache) >= _MAXCACHE:
    247         _cache.clear()

error: unexpected end of pattern

这让我觉得那个正则表达式不是为python编写的。

有什么帮助吗?

4

2 回答 2

4

您的正则表达式无法编译,因为Python 的模块(?> ...)不支持原子分组(又名“独立子表达式”)的语法。PyPI 上re有一个可用的实验性重新实现,它确实支持原子组和其他不错的功能,所以你可以尝试一下。re

于 2012-11-01T14:38:55.680 回答
2

XML 不是常规语言。因此,您无法使用正则表达式正确解析它。

改为使用和自定义 XML 解析器,例如BeautifulSoup

如需更全面的答案,请参阅相关问题“RegEx match open tags except XHTML self-contained tags”

于 2012-11-01T14:26:25.410 回答