2015-12-01 3 views
0

Я написал регулярное выражение для соответствия электронной почте, оно работает для одного электронного письма, но для нескольких электронных писем оно не работает. Кто-нибудь может мне помочь? Заранее спасибо!Как сопоставить несколько писем по регулярному выражению?

>>> import re 
>>> str = "my email are [email protected] and [email protected]" 
>>> r = re.search(r'[A-Za-z0-9\.+_-][email protected][A-Za-z0-9]+\.[a-zA-Z]+',str) 
>>> print r.group() 
[email protected] # I want to get ([email protected], [email protected]) 
+0

проявлять осторожность - адреса электронной почты и регулярные выражения не хорошие партнеры для объединения. https://blog.codinghorror.com/regex-use-vs-regex-abuse/ – polhemic

ответ

1

re.search находит только первое происшествие.

От https://docs.python.org/2/library/re.html

«Сканирование через строку поиска первого место, где регулярное выражение производит матч, и возвращает соответствующий экземпляр MatchObject. Не Возвращайтесь Нет, если нет позиции в строке не соответствует шаблону»

так что это следует сделать трюк:

import re 
str = "my email are [email protected] and [email protected]" 
for r in re.finditer(r'[A-Za-z0-9\.+_-][email protected][A-Za-z0-9]+\.[a-zA-Z]+',str): 
    print r.group() 
+4

'r = re.findall (r '[A-Za-z0-9 \. + _-] + @ [A-Za -z0-9] + \. [a-zA-Z] + ', str) 'также будет работать –

+0

, что на самом деле более элегантно и оптимизировано – Markon

+0

@TomRon абсолютно прав :) –

0

Вы должны использовать findall метод re который дает вам список группы mathches в то время как .group() дает первый матч только

Надеются, что это помогает

>>> import re 
>>> str = "my email are [email protected] and [email protected]" 
>>> r = re.findall(r'([A-Za-z0-9\.+_-][email protected][A-Za-z0-9]+\.[A-Za-z0-9\.+_-]+)',str) 
>>> r 
['[email protected]', '[email protected]'] 
Смежные вопросы