python正则表达式匹配0或1次重​​复

aar*_*ung -1 python regex

我想匹配html中的html标头<h1> - <h6>与python正则表达式.有些标题包含'id'属性,我想把它放到一个组中.

通过尝试以下表达式,我得到一个具有id属性的表达式.

>>>re.findall(r'<h[1-6].*?(id=\".*?\").*?</h[1-6].*?>','<h1>Header1</h1><h2 id="header2">header2</h2>')
['id="header2"']
Run Code Online (Sandbox Code Playgroud)

问号使RE以匹配前面的RE的0或1的重复.如果我放一个在右括号之后,它将返回两个空字符串.

>>>re.findall(r'<h[1-6].*?(id=\".*?\")?.*?</h[1-6].*?>','<h1>Header1</h1><h2 id="header2">header2</h2>')
['', '']
Run Code Online (Sandbox Code Playgroud)

如何使用一个正则表达式获得以下结果?

['', 'id="header2"']
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 5

您使用的是错误的工具.不要使用正则表达式来解析HTML.请改用HTML解析器.

BeautifulSoup图书馆,使您的任务变得简单:

from bs4 import BeautifulSoup

soup = BeautifulSoup(htmlsource)

headers = soup.find_all(['h1', 'h2', 'h3', 'h4', 'h5', 'h6'])
print [h.attrs.get('id', '') for h in headers]
Run Code Online (Sandbox Code Playgroud)

演示:

>>> from bs4 import BeautifulSoup
>>> htmlsource = '<h1>Header1</h1><h2 id="header2">header2</h2>'
>>> soup = BeautifulSoup(htmlsource)
>>> headers = soup.find_all(['h1', 'h2', 'h3', 'h4', 'h5', 'h6'])
>>> [h.attrs.get('id', '') for h in headers]
['', 'header2']
Run Code Online (Sandbox Code Playgroud)