2012-04-06 2 views
1

Хорошо, в питоне, я извлечение писем из строки следующим образом: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) 

И это работает, до тех пор, пока существует пространство между письмами. Но это не всегда так. Например:

Hello, [email protected]

вернется:

[email protected]

но, возьмите следующую строку:

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

Это вернет null. Поэтому возникает вопрос: как я могу сделать так, чтобы регулярное выражение разделило разделитель? Я хотел бы получить

[email protected]

во всех случаях, независимо от того, пунктуации рядом с ним. Возможно ли это в python?

«Разделение по регулярному выражению» Я имею в виду, что если программа встречает шаблон в строке, он будет извлекать эту часть и помещать ее в список.

ответ

2

Я не эксперт регулярное выражение, но я бы сказал, что вы ищете re.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]'] 

Обратите внимание, что findall может обрабатывать более чем один адрес электронной почты:

>>> 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

Смежные вопросы