2012-03-06 10 views
-3

一部のファイル(FILE.DAT)アウトPythonと正規表現 - 検索し、一致

#####Start#### 
sometext 
sometext 
From: [email protected] 
some text 
some text 
####End##### 

import re 
for line in open('file.dat'): 
    _mail=re.search(r"\[email protected]\w+\.\w{2,4}").group() 
print(type(_mail)) 

: 'NoneType'

import re 
for line in open('file.dat'): 
    if(re.match(r"From:.*",line)): 
     _mail=re.search(r"\[email protected]\w+\.\w{2,4}").group() 
print _mail 
アウト

[email protected]

、私にしてください説明。なぜ私は最初の方法を使うことができないのですか?

+2

re.searchは、 2つの議論。 –

答えて

1

最初の試行では、各行のメールパターンを検索します。変数_mailには、ループの最後にre.searchの最後の結果が含まれます(正確には、ファイル内の最後の行のre.searchの結果)。

結果が上書きされます。

あなたが最初の方法を使用したい場合は、あなたが追加する必要があります。

if _mail: break 

ループを終了するに

2

最初のケースでは、パターンの各行をチェックしているためです。 "From:"行にあるときには正常に取得されますが、ループは続行され、次の行に一致します。パターンが次の行で一致しないため、_mailオブジェクトはNoneで上書きされます。

0

最初のスニペットは関係なく、あなたが反対に一致しているどの行の、_mailを上書きします。結果として、正規表現は入力の最後の行にのみ適用され、結果は返されません(したがってNone)。 2番目のものは、おそらくあなたが何をしたいのか、Fromの行とのみ一致します。代わりに.startswith('From:')を使用することもできます。

0

sometextの行で正規表現が失敗します。つまり、一致オブジェクトは得られませんが、結果は re.search()です。 .group()メソッドを呼び出しようとすると、失敗します(Noneには、もちろんありません)。だから、AttributErrorがあるはずです(しかし、あなたのコードは構文的に無効なので、全く実行してはいけません)。