0

因此,我正在尝试编写自己的脚本,这些脚本将接收 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>']
4

3 回答 3

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

- 或者 -

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

后面的问号*导致它是一个非贪婪匹配,这意味着它只需要它需要的量,而不是正常的,它需要尽可能多的。

第二种形式使用更频繁,它使用字符类来匹配<除 之外的所有内容,因为除了结尾之外,它永远不会存在于标签内的任何地方。

于 2013-07-03T06:11:14.480 回答
1

尽管您真的不应该使用 regex 解析 HTML,但我知道这是一个学习练习。

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

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

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

于 2013-07-03T06:12:27.147 回答
0
re.findall('(?m)<[^<^>.]+>',s)
于 2013-07-03T06:13:31.363 回答