1

さて、Pythonでは、次のような文字列からメールを抽出しています。

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

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

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

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

そして、これは、電子メールの間にスペースがある限り機能します。しかし、これが常に当てはまるとは限りません。例えば:

Hello, foo@foo.com

戻ります:

foo@foo.com

ただし、次の文字列を使用してください。

I know my best friend mailto:foo@foo.com!

これはを返しnullます。したがって、問題は、正規表現が分割する区切り文字になるようにするにはどうすればよいですか?取得したい

foo@foo.com

すべての場合において、その隣のパンクに関係なく。これはPythonで可能ですか?

「正規表現による分割」とは、プログラムが文字列内のパターンに遭遇した場合、その部分を抽出してリストに入れることを意味します。

4

3 に答える 3

2

私は正規表現の専門家ではありませんが、あなたが探していると思いますre.findall

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

findall複数のメールアドレスを処理できることに注意してください。

>>> email_reg.findall('Text text foo@foo.com, text text, baz@baz.com!')
['foo@foo.com', 'baz@baz.com']

編集: Qtaxヘルプを使用すると、正規表現が改善されるはずです。

于 2012-04-06T19:15:10.823 に答える
1

私があなたの正規表現で見る問題は^、文字列の始まりと一致するものと文字列$の終わりと一致するものの使用です。削除してからサンプルテストケースで実行すると、機能します

>>> re.findall("[A-Za-z0-9\._-]+@[A-Za-z0-9-]+.[A-Za-z0-9-\.]+","I know my best friend mailto:foo@foo.com!")
['foo@foo.com']
>>> re.findall("[A-Za-z0-9\._-]+@[A-Za-z0-9-]+.[A-Za-z0-9-\.]+","Hello, foo@foo.com")
['foo@foo.com']
>>> 
于 2012-04-06T19:19:33.983 に答える
1

re.searchまたはを使用しre.findallます。また、式を適切にエスケープし(.文字クラスの内部ではなく、文字クラスの外部でエスケープする必要があります)、アンカーを削除/置換する必要が^あります($たとえば、\b)。例:

r"\b[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+\b"
于 2012-04-06T19:15:18.667 に答える