Python で正規表現を使用して文字列内の特定の URL を抽出する方法を理解しようとしています。たとえば、'blahblahblah (a href="example.com")' があるかもしれません。この場合、すべての「example.com」リンクを抽出したいと考えています。文字列を分割する代わりに、どうすればそれを行うことができますか?
ありがとう!
HTML の解析に最適なBeautifulSoup (リンク: http://www.crummy.com/software/BeautifulSoup/ ) という優れたモジュールがあります。HTML から情報を取得するには、正規表現を使用する代わりにこれを使用する必要があります。BeautifulSoup の例を次に示します。
>>> from bs4 import BeautifulSoup
>>> html = """<p> some <a href="http://link.com">HTML</a> and <a href="http://second.com">another link</a></p>"""
>>> soup = BeautifulSoup(html)
>>> mylist = soup.find_all('a')
>>> for link in mylist:
... print link['href']
http://link.com
http://second.com
ドキュメントへのリンクは非常に簡単です: http://www.crummy.com/software/BeautifulSoup/bs4/doc/
正規表現を使用しない:
HTML や XML (または URL) を扱うときに、最初から正規表現を考えてはいけない理由は次のとおりです。
とにかく正規表現を使用したい場合は、
仕事をするいくつかのパターンと、見つけたい文字列を取得するいくつかの方法を見つけることができます。
これらのパターンは仕事をします:
r'\(a href="(.*?)"\)'
r'\(a href="(.*)"\)'
r'\(a href="(+*)"\)'
1.re.findall()
re.findall(pattern, string, flags=0)
文字列のリストとして、文字列内のパターンの重複しない一致をすべて返します。文字列は左から右にスキャンされ、見つかった順序で一致が返されます。パターンに 1 つ以上のグループが存在する場合は、グループのリストを返します。パターンに複数のグループがある場合、これはタプルのリストになります。空の一致は、別の一致の先頭に触れない限り、結果に含まれます。
import re
st = 'blahblahblah (a href="example.com") another bla <a href="polymer.edu">'
re.findall(r'\(a href="(+*)"\)',s)
2.re.search()
re.search(pattern, string, flags=0)
文字列をスキャンして、正規表現パターンが一致する場所を探し、対応する MatchObject インスタンスを返します。
次に、re.group()
グループを通過します。たとえば、r'\(a href="(.+?(.).+?)"\)'
ここでも機能している regex を使用すると、いくつかの囲まれたグループがあります。グループ 0 はパターン全体に一致し、グループ 1 は括弧で囲まれた最初の囲まれたサブパターンに一致します。(.+?(.).+?)
パターンのみの最初の出現を探す場合は、検索を使用します。そして、あなたの例では、これは
>>> st = 'blahblahblah (a href="example.com") another bla (a href="polymer.edu")'
>>> m=re.search(r'\(a href="(.+?(.).+?)"\)', st)
>>> m.group(1)
'example.com'
正規表現は非常に強力なツールですが、すべての状況で使用できるとは限りません (他の人が既に示唆しているように)。そうは言っても、これはコンソールからの最小限の例であり、リクエストに応じて正規表現を使用しています。
>>> import re
>>> s = 'blahblahblah (a href="example.com") another bla <a href="subdomain.example2.net">'
>>> re.findall(r'a href="(.*?)"', s)
['example.com', 'subdomain.example2.net']
に焦点を当てr'a href="(.*?)"'
ます。英語では、「 で始まる文字列を見つけてa href="
、次の"
.
()
「ここにあるものだけを保存する」という意味.
「任意の文字」を意味します*
「何度でも」という意味?
は「貪欲ではない」という意味です。つまり、要件を満たす最短の文字列を見つけます (疑問符なしで試してみると、何が起こるかがわかります)。チッ!