2012-04-06 11 views
1

さて、Pythonで、私はそうのような文字列からのメールを抽出しています:Pythonは正規表現で分割されていますか?

split = re.split(" ", string) 
emails = [] 

pattern = re.compile("^[a-zA-Z0-9_\.-][email protected][a-zA-Z0-9-]+.[a-zA-Z0-9-\.]+$"); 

for bit in split: 
    result = pattern.match(bit) 

    if(result != None): 
     emails.append(bit) 

そして、これは動作しますが、限り、電子メールの間にスペースがあるとして。しかし、これは必ずしもそうではないかもしれません。たとえば、次の文字列を取り、

[email protected]

をしかし:

Hello, [email protected]

は戻ってくる。これはnullを返します

I know my best friend mailto:[email protected]!

。ですから問題は、正規表現を分割する区切り文字にするにはどうしたらよいですか?私は関係なく、その横に句読点の、すべての場合に

[email protected]

を取得したいと思います。これはPythonで可能ですか?

"splitting by regex"とは、プログラムが文字列のパターンに遭遇すると、その部分を抽出してリストに入れることを意味します。

答えて

2

私は正規表現専門家ではないんだけど、私はあなたがre.findallを探していると言うだろう:findallが複数のメールアドレスを処理できることを

>>> email_reg = re.compile(r'[a-zA-Z0-9_.-][email protected][a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+') 
>>> email_reg.findall('I know my best friend mailto:[email protected]!') 
['[email protected]'] 

お知らせ:

>>> email_reg.findall('Text text [email protected], text text, [email protected]!') 
['[email protected]', '[email protected]'] 

編集: Qtaxを使うと、正規表現がより良くなるはずです。

+0

完全に動作し、私のコードをクリーンアップします。ありがとう! :D –

+0

少なくともエスケープする必要がある唯一の '.'をエスケープすることを忘れないでください。 – Qtax

+0

@ Qtax:ありがとう、私は変更を加えました。私は正規表現は私の最高ではない、あなたはまだ何かが間違っていることを参照して編集または私に知らせることをためらわないでください:) –

1

re.searchまたはre.findallを使用してください。 また、例えば、(\bで例えば)正しく表現をエスケープ(.ニーズが文字クラスではなく、内部の外にエスケープする)とアンカー^$を交換/削除する必要があります。

r"\b[a-zA-Z0-9_.+-][email protected][a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+\b" 
+0

"\ b"の冒頭に "mailto:[email protected] ! – marue

+1

@marue、あなたはそれを試してみましたか?それは正常に動作します。 ':'は単語文字ではありません。 – Qtax

+0

あなたは正しいです、私はそれをテストしました。ごめんなさい。 – marue

1

問題あなたの正規表現には、文字列の終わりに一致すると、文字列の終わりに一致する$の使用があります。それを削除してサンプルテストケースで実行すると、動作します。

>>> re.findall("[A-Za-z0-9\._-][email protected][A-Za-z0-9-]+.[A-Za-z0-9-\.]+","I know my best friend mailto:[email protected]!") 
['[email protected]'] 
>>> re.findall("[A-Za-z0-9\._-][email protected][A-Za-z0-9-]+.[A-Za-z0-9-\.]+","Hello, [email protected]") 
['[email protected]'] 
>>> 
+0

あなたの正規表現には最後に '+'がありません。 –

+0

@RikPoggi:Yiik、ありがとう – Abhijit

関連する問題