2016-12-28 3 views
1

Я пытаюсь извлечь электронные письма из текста. Я использовал re.search, который вернул 1. возникновение, но затем я продолжил и использовал re.findall. К моему удивлению, re.findall находит меньше писем, чем re.search. В чем может быть проблема?найти электронные письма в тексте с помощью python и regex

Код:

searchObj = re.search(r'[A-Za-z0-9\._+-][email protected][A-Za-z0-9]+(\.|-)[A-Za-z0-9\.-]+', text) 
     if searchObj: 
      mail = searchObj.group() 
      if mail not in emails: 
       emails.add(mail) 

listEmails = re.findall(r'[A-Za-z0-9\._+-][email protected][A-Za-z0-9]+(\.|-)[A-Za-z0-9\.-]+', text) 
     for mail in listEmails: 
      if mail not in emails: 
       emails.add(mail) 

ответ

3

Заменить группу захвата (\.|-) с не захвата одного или даже с классом персонажа:

r'[A-Za-z0-9._+-][email protected][A-Za-z0-9]+[.-][A-Za-z0-9.-]+' 
           ^^^^ 

Или еще короче:

r'[\w.+-][email protected][^\W_]+[.-][A-Za-z0-9.-]+' 

Else , re.findall вернет только список захваченных значений.

Python demo:

import re 
rx = r'[\w.+-][email protected][^\W_]+[.-][A-Za-z0-9.-]+' 
s = '[email protected] and more [email protected]' 
print(re.findall(rx, s)) 
# => ['[email protected]', '[email protected]'] 
+0

Можете ли вы отрицать группу внутри класса символов. '[^ (\ D +. \ D +)]'? – MYGz

+0

Нет, не так. Решение зависит от того, что вам нужно достичь в конце. Возможно, поможет [умеренный жадный токен] (http://stackoverflow.com/a/37343088/3832970). –

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