所以我正在尝试编写自己的脚本,它将接收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>']
答案 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)