使用
re.compile('">(CVE.*?)</a>')
# instead of your re.compile('\>"(CVE.*)"\<\/a>')
注意的是字符<> /不需要在正则表达式模式
进行转义并注意.*
后?
字符停止以便量词*
的贪婪行为的匹配在第一个</a>
受到阻止时停止。关于这一点请参阅文档,这是基本的
。
有时使用re
时,分析一个XML有问题| GML文本
有一次,我被告知,一个可能的问题是,标签可以在几行写,例如:
ss = '''
<pre>
<a href="https://www.redhat.com/security/data/cve/CVE-2010-3718.html">CVE-20
10-371
8</a>
</pre>'''
在这种情况下,不会有任何匹配,因为在正则表达式模式中用作符号的点不会象征换行符'\ n'。因此该模式的.*?
部分将不允许按行运行。
要纠正此问题,请使用re.DOTALL
规范,该规范为点符号提供了表示任何和所有字符的权力。
。
请注意,常见的信念是,不得使用工具来解析SGML或XML文本。但很少有人能够彻底解释为什么。我是其中一个不知道原因的人。
但个人而言,我认为正则表达式可以用来分析文本。我写'分析'而不是'PARSE'。
据我所知,解析是分析文本和基于标签构建树形表示的过程。
虽然我将文本分析定义为...分析它,但没有获得树表示的目的。
当树形表示不需要从文本中提取数据时,请使用正则表达式,并且不要听那些对这个主题有宗教考虑的人,比如在有趣但欺骗性(在我看来)的帖子中,其链接已被鉴于
尽管其他答案提出了更优雅的解决方案,这一个为我捏了一把。谢谢。 – user1117603 2011-12-27 22:30:09