文件清理使用正则表达式

时间:2013-07-03 06:08:24

标签: python html regex

所以我正在尝试编写自己的脚本,它将接收html文件并返回错误并清理它们(这样做是为了学习正则表达式,因为我发现它很有用)

我首先使用快速函数获取文档,并以正确的顺序抓取所有标记,以便我可以检查以确保它们全部关闭...我使用以下内容:

>>> s = """<a>link</a>
... <div id="something">
...     <p style="background-color:#f00">paragraph</p>
... </div>"""
>>> re.findall('(?m)<.*>',s)
['<a>link</a>', '<div id="something">', '<p style="background-color:#f00">paragraph</p>', '</div>']

据我所知,它抓住了两个胡萝卜括号之间的所有东西,而这就成了整条线。我将用什么来返回以下内容:

['<a>','</a>', '<div id="something">', '<p style="background-color:#f00">','</p>', '</div>']

3 个答案:

答案 0 :(得分:2)

re.findall('(?m)<.*?>',s)

- 或 -

re.findall('(?m)<[^>]*>',s)

*之后的问号会导致它成为非贪婪的匹配,这意味着它只需要它所需的数量,而不是正常的,它需要的是尽可能多。

第二种形式更经常使用,它使用一个字符类来匹配除<之外的所有内容,因为除了结尾之外,它在标记内的任何地方都不会存在。

答案 1 :(得分:1)

虽然你真的shouldn't be parsing HTML with regex,但我知道这是一个学习练习。

您只需要再添加一个字符:

>>> re.findall('(?m)<.*?>',s) # See the ? after .*
['<a>', '</a>', '<div id="something">', '<p style="background-color:#f00">', '</p>', '</div>']

*?匹配前面值的0或更多(在本例中为.)。这是一个懒惰的匹配,并且匹配尽可能少的字符。

答案 2 :(得分:0)

re.findall('(?m)<[^<^>.]+>',s)