項目

2016-05-24 10 views
1

背景:項目

私はそれの引数の一つは、ファイル内の電子メールアドレスリストとして、必要で小さなスクリプトを書いています。これらのスクリプトは、SMTPサーバーへのtelnet接続を介して電子メールアドレスを使用するため、構文的に有効である必要があります。その結果、私は電子メールアドレスの妥当性をチェックする機能を入れている(ちなみに、この正規表現は完璧ではないが、問題の焦点では​​ないことが、私と一緒に負担してくださいおそらくまで緩めされます。):

def checkmailsyntax(email): 
    match = re.match('^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$', email) 

    if match == None: 
     return True 

私は、スクリプトを自動的に削除することは素晴らしいことだ考え出し

with open(args.targetfile) as targets: 
    target_email_list = targets.readlines() 

:プログラムはmain()(argparseで)引数として入力ファイル名を読み、(現在はグローバル)リストに挿入するために行きますcheckmailsyntax関数が失敗した場合は、リストから電子メールアドレスを削除してくださいこの掃除リストは、SMTPサーバに構文的に有効な電子メールアドレスを提出するために行くことができます:私は前に、それが仕事ですやっているかどうかを確認するために、削除要素スニペット後の両方に入れているコードをチェック

for i in target_email_list: 
    if checkmailsyntax(i): 
     target_email_list.remove(i) 

エラー:

for i in target_email_list: 
    print i 

問題:コードの出力は、このようです:delete要素スニペット(および提出ファイルの内容全体)の前に

delete要素スニペット後

[email protected] 
[email protected] 
[email protected] 
incorrectemail.com 
[email protected] 
wrongemail.com 
[email protected] 
[email protected] 

だから私はかなり'noemail.com''pretendemail.com''badlywrong.com'が削除された理由として困惑

、まだ 'incorrectemail.com''wrongemail.com'はありません。これは、文法的に間違った2つの電子メールがファイル内に順番に存在する場合に発生するようです。

誰でも正しい方向に向けることができますか?

+0

はい、おそらく重複しています。私は何を探しているのか分からなかった。ありがとうBhargav。 – Ian

答えて

3

それを反復しながら、あなたはリストから要素を削除しているので、それは次のとおりです。

for i in target_email_list: 
    if checkmailsyntax(i): 
     target_email_list.remove(i) # here 

ので、以下の値が一緒にいる:

pretendemail.com 
wrongemail.com 

あなたがpretendemail.com電子メールを削除すると、次の1 wrongemail.comこれが反復されたとイテレータは考える。したがって、次に来るアイテムは[email protected]となり、wrongemail.comは有効な構文がチェックされません。構文を確認する前にprint(i)を追加して、自分で確認してください。

あなたは、この目的のためにリストの内包表記を使用することができます。

valid_emails = [email for email in target_email_list if checkmailsyntax(email)] 
+1

そのように簡単です。現在のコードでは、valid_emailsは私にすべて無効なものを与えます。私は '== None'をcheckmailsyntax関数から取り除いてソートしました。それで見つかったものがあればTrueを返します。ありがとうございました! – Ian

0

AKSの答えはあなたがカバーしている:あなたが反復処理されているリストから削除しないでください!クイックフィックスの場合は、コピーを繰り返しながら実際のリストから削除することができます。

for i in target_email_list[:]: # iterates over the slice 
    if checkmailsyntax(i): 
     target_email_list.remove(i) # removes from actual list