1

そのフレーズの単語がhtmlタグ内に現れない限り、正規表現を使用してフレーズを一致させようとしています。

この例では、次の URL を使用しています。

   url = "http://www.sidley.com/people/results.aspx?lastname=B" 

私が使用している正規表現は次のとおりです。

   regexp = "Babb(?!([^<]+)?>).+?Jonathan(?!([^<]+)?>).+?C(?!([^<]+)?>)"
   page = urllib2.urlopen(url).read()
   re.findall(regexp, page, re.DOTALL)

その正規表現を使用すると、次の出力が得られます。

   [('', '', '')]

正規表現を(*外側の括弧に注意してください)に変更すると:

   regexp = "(Babb(?!([^<]+)?>).+?Jonathan(?!([^<]+)?>).+?C(?!([^<]+)?>))"
   page = urllib2.urlopen(url).read()
   re.findall(regexp, page, re.DOTALL)

私は得る:

   [('Babb, Jonathan C', '', '', '')]

これがなぜなのか、私は混乱しています。

1) これらの空の文字列を一致として取得するのはなぜですか? 2) 最初の正規表現で、実際の一致が得られないのはなぜですか?

そして最後に、

これを修正するにはどうすればよいですか?

よろしくお願いします。

4

1 に答える 1

4

空の文字列を取得する理由は、貪欲でないを使用しているためです。その情報が必要ない場合は、括弧の一部を削除してください。実際、グループ化されていない括弧や無関係なペアのいくつかを実際に調べる必要があります。


(プロセス全体で) 使用する最終的なコードは次のようになります。

import re
import urllib2


url = 'http://www.sidley.com/people/results.aspx?lastname=B'
regexp = 'Babb(?!<+?>).+?Jonathan(?!<+?>).+?C(?!<+?>)'

page = urllib2.urlopen(url).read()
re.findall(regexp, page, re.DOTALL)

正規表現の内訳:

  • 最初の単語を選択します。 Babb
  • どの HTML タグにも一致させたくないので、must-not-match アンチグループを使用します。(?!)
  • この中に、HTML タグを選択する正規表現を配置します ( ではなく、この特定の式が機能する理由はよくわかりません.+?>)。<+?>
  • 貪欲ではなく、少なくとももう 1 つの文字を選択します。.+?
  • Jonathan他の単語 (および)のそれぞれについて、このプロセスを繰り返しますC
于 2013-02-27T02:40:50.283 に答える