Python正则表达式或不匹配

时间:2011-11-01 17:07:16

标签: python regex

出于某种原因,

m = re.search('(<[^pib(strong)(br)].*?>|</[^pib(strong)]>)', '</b>')

匹配字符串,但

m = re.search('(</[^pib(strong)]>)', '</b>')

没有。我正在尝试匹配

的所有标签
<p>, <b>, </p>, </b>

等等。我误解了一些关于'|'的事情吗?作品?

1 个答案:

答案 0 :(得分:2)

你做错了。首先,[]之间的字符匹配方式不同:[ab]将匹配ab,因此在您的情况下,[^pib(strong)]将匹配所有不匹配的内容pib(等等(请注意^的否定)。你的第一个正则表达匹配仅仅是巧合。

此外,您不应该使用正则表达式解析html / xml。相反,使用适当的xml解析库,如lxml或beautifulsoup。

以下是lxml的简单示例:

from lxml import html
dom = html.fromstring(your_code)
illegal = set(dom.cssselect('*')) - set(dom.cssselect('p,b'))
for tag in illegal:
    do_something_with(tag)

(这是一个很小的,可能是次优的示例;它只是为了向您展示使用这样一个库是多么容易。另外,请注意该库将代码包装在<p>中,所以你应该考虑到这一点)