2016-09-08 7 views
0

私は検索とグループを使って文字列の特定の部分を抽出しています。しかし、私が持っている問題は、それが初めて発生するときしか見つからないということです。それが正しいのは、それが検索の仕組みだからです。検索でRegexが複数一致する

私はどこで発生するのかを見つける必要がありますが、私がfindallを使用すると、私が望んでいない配列が作成され、グループ()を使って作業することができないので、余分なステップがありますこれを行う別の方法がありますか?ここで

は、私が持っているコードです:

for num, line in enumerate(file, 1): 
    if check in line: 
     print 'href at line', num 
     reg = re.compile('href="(.*?)"|href=\'(.*?)\'') 
     link = re.search(reg, line) 
     link = link.group(1) 
     print 'url:', link 

私は唯一の行の最初のURLを取得します。

+1

"findallは私が欲しいものではない配列を作成します*" - どうしてですか?代わりに何をしたいですか? – TessellatingHeckler

+1

このような質問をするときは、問題を再現するための文字列の例を挙げてください。ここでは、正規表現を使ってhtmlを解析しようとしているようですが、これは方法ではありません。pythonにはいくつかのhtmlパーサーがあります。 –

+0

正規表現について学ぶのを手助けするためのクラス割り当てです。実際にはhtmlを解析するのではありません。 – TheBandit

答えて

2

re.finditerを使用し、結果をループします。 finditerは、最初のヒットだけでなく、各マッチオブジェクトを1つずつ返します。

# Move compile outside the loop; the whole point of compiling is to do the work once 
# and reuse the compiled object over and over 
reg = re.compile('href="(.*?)"|href=\'(.*?)\'') 
for num, line in enumerate(file, 1): 
    if check in line: 
     print 'href at line', num 
     for link in reg.finditer(line): 
      print 'url:', link.group(1) 
+0

ありがとうございました。もし私が尋ねることができるなら、finditerとfindallの違いは何ですか? – TheBandit

+0

@TheBandit:私の答え(またはここでは推測します)の[docsへのリンク](https://docs.python.org/3/library/re.html#re.finditer)をクリックしてください。 'findall'は' str'のマッチした部分を 'str'(またはキャプチャグループが使われている場合はキャプチャされた文字列)として返し、完全に実現された' list'を返します。 'finditer'はジェネレータをベースにしています(反復する際に一度に1つずつ一致し、結果の' list'を熱心に生成しません)。 – ShadowRanger

+0

ありがとうございます。 私のプログラムがテキストファイルでこの行をチェックするときに気にしないでもう一度簡単な質問: TheBandit

関連する問題