2

私は文字列を持っています

<a href="/p/123411/"><img src="/p_img/411/123411/639469aa9f_123411_100.jpg" alt="ABCDXYZ" />

PythonでABCDXYZを見つけるための正規表現とは

4

3 に答える 3

5

HTML の解析に正規表現を使用しないでください。BeautifulSoupを使用します。

from bs4 import BeautifulSoup as BS
text = '''<a href="/p/123411/"><img src="/p_img/411/123411/639469aa9f_123411_100.jpg" alt="ABCDXYZ" />'''
soup = BS(text)
print soup.find('img').attrs['alt']
于 2013-01-07T05:12:54.563 に答える
2

その属性の値を探している場合は、次のaltようにすることができます。

>>> r = r'alt="(.*?)"'

それで:

>>> m = re.search(r, mystring)
>>> m.group(1)
'ABCDXYZ'

また、re.findall複数を検索したい場合に使用できます。

ただし、このコードは次のようなものに簡単にだまされます。

<span>Here's some text explaining how to do alt="foo" in an img tag.</span>

一方、次のようなものを拾うこともできません。

<img src='/p_img/411/123411/639469aa9f_123411_100.jpg' alt='ABCDXYZ' />

どのように対処しますか?簡単に言えば、そうではありません。XML と HTML は通常の言語ではありません。

ここで、Python の re エンジンは実際には真の正規表現エンジンではないことを指摘しておく価値があります。さらに、チューリング完全なプログラミング言語に組み込まれています。したがって、明らかに、 Pythonre. この回答は、で書かれたパーサーの一部を示してperlいます。ここでは、正規表現が面倒な作業のほとんどを行います。しかし、それはあなたがこのようにすればよいという意味ではありませ。完全に優れたパーサーが既に存在することを考えると、そもそもパーサーを作成するべきではありません。クイック&ダーティな遊びには、正規表現で問題ありません。制作プログラムの場合、それは'

上司にパーサーの使用を許可するよう説得する 1 つの方法は、すべてが明らかに有効であり、完全なパーサーがなければ正規表現ベースのソリューションではおそらく処理できない一連のテストを作成することです。解析可能なテストを考え出すことができますが、指数バックトラッキングのみを使用するため、正規表現では 12 時間、bs4 では 0.1 秒かかりますが、それは少しトリッキーです...</p>

もちろん、オンラインで記事 (および、これこれ、その他 300 のダップなどの SO の質問) を探して、上司に見せるのに最適な記事を選ぶことも価値があります。

他の方法で上司を本当に納得させることができない場合は、この時点で完了です。指定されたものを考えると、これは機能します。実際に意図されているかどうかにかかわらず、心を読む以外に何も機能しません。失敗する実際のケースが増えるにつれて、より複雑な代替やコンテキストを正規表現自体に追加するか、一連の正規表現とポストフィルターを使用して、最終的に取得するまでハックすることができます。うんざりして、もっと良い仕事を見つけてください。

于 2013-01-07T05:12:33.750 に答える
0

まず、免責事項: HTMLの解析に正規表現を使用しないでください。これには BeautifulSoup を使用できます

次に、実際に正規表現の使用に真剣に取り組んでおり、上記がまさにあなたが望むケースである場合は、次のようにすることができます。

<a href="[a-zA-Z0-9/]+"><img src="[a-zA-Z0-9/]+" alt="([a-zA-Z0-9/]+)" />

また、一致オブジェクトの groups 属性を介してテキストにアクセスできます。

于 2013-01-07T05:16:51.510 に答える