2017-06-15 19 views
0

私はPythonの標準ライブラリbuilt-in functionsページから関数定義を抽出して正規表現で練習しようとしています。これまでのところ、定義は一般に<dd><p></dd></dl>の間に印刷されています。試してみるとhtmlファイルから定義を抽出するにはどうすればよいですか?

import re 
fname = open('functions.html').read() 
deflst = re.findall(r'<dd><p>([\D3]+)</dd></dl>', fhand) 

実際には</dd></dl>で停止しません。これはおそらく私がここで行方不明になっている非常に愚かなものですが、私は本当にこれを理解しようとするのは苦労しています。

答えて

2

正規表現を試してみては意味で、左から右に評価されます。だからあなたの正規表現では、

r'<dd><p>([\D3]+)</dd></dl>' 

正規表現エンジンが最初にそうであれば、それはそれが数字でないか3のかどうかについて、それぞれをチェックし、順番に次の各文字を見ていきます、<dd><p>を探し、となり、マッチに追加してください。 </dd></dl>のすべての文字は、クラス "nondigitまたは3"にあるので、すべてが[\D3]+に一致する部分に追加され、エンジンは忠実に継続します。 3以外の桁の文字が見つかった場合にのみ停止し、次に正規表現の残りの部分に "通知"します(</dd></dl>)。

これを修正するには、あなたがそうのような消極的量指定子を使用することができます:正規表現エンジンは、それが試合に追加されますどのくらいで保守的であるべきであることを意味

r'<dd><p>([\D3]+?)</dd></dl>' 

(追加 ?に注意してください)。できるだけ多くの文字を「ぐらつき」させるのではなく、今度は [\D3]+?を1文字にマッチさせてから、正規表現の残りの部分が一致するかどうかを確認します。一致しない場合は、 [\D3]+?と2文字などです。

それはまだ完全な正規表現の一致をさせることができますがあることs「を[\D3]+?[\D3]の最短の文字列にマッチするのに対し、それはまだ完全な正規表現の一致をさせることができますがあることs」は基本的には、[\D3]+[\D3]の可能な限り最長の文字列にマッチします。


「現実世界」におけるもちろん one shouldn't really be using regular expressions to parse HTML

、しかし、あなただけの正規表現の練習をしたい場合は、これはおそらくどれにも劣らテキストサンプルです。

+0

ああ、説明をいただきありがとうございます!非常に役立ちます! – bootoons

1

デフォルトでは、すべての量指定子はgreedyであり、できるだけ多くの文字を一致させたいという意味です。数字の後に?を使用して、できるだけ少ない文字に一致するlazyにすることができます。 \d+?は少なくとも1桁に一致しますが、できるだけ少ない数字に一致します。

r'<dd><p>([\D3]+?)</dd></dl>'

関連する問題