-1

<h1> - <h6>html の html ヘッダーを python 正規表現と一致させたい。一部のヘッダーには'id'属性が含まれており、グループに入れたいと考えています。

次の式を試すと、id 属性を持つ式が得られます。

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

疑問符により、RE は先行する RE の 0 回または 1 回の繰り返しに一致します。私が入れたら右括弧の後に、2 つの空の文字列が返されます。

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

次の結果を得るために 1 つの正規表現を使用する方法は?

['', 'id="header2"']
4

2 に答える 2

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]

デモ:

>>> 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']
于 2013-08-19T13:00:01.103 に答える
1

「。」はスペースと一致しないため、明示的に含める必要があります。1つの可能性は次のとおりです。

>>> re.findall(r'<h[1-6].*?( +id=\".*?\" ?)?.*?</h[1-6].*?>','<h1>Header1</h1><h2 id="header2">header2</h2>')
['', ' id="header2"']
于 2013-08-19T13:26:01.067 に答える