найти все строки, содержащие адрес электронной почты - PullRequest
0 голосов
/ 27 октября 2018

Я пытаюсь сохранить все строки из файла, содержащего адрес электронной почты.

Пример, file.txt:

Lorem ipsum dolor email1@mail.com sit amet,
consectetur adipiscing elit
sed do eiusmod tempor incididunt ut labore
et dolore magna aliqua. Ut enim ad minim veniam
email2@gmail.com quis nostrud exercitation ullamco
laboris nisi ut aliquip ex ea commodo consequat.
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
Excepteur sint occaecat cupidatat
non proident email3@yahoo.com
sunt in culpa qui officia deserunt mollit anim id est laborum.

Из файла file.txt я хочу сохранить только строки:

Lorem ipsum dolor email1@mail.com sit amet,
email2@gmail.com quis nostrud exercitation ullamco
non proident email3@yahoo.com

Я что-то пробовал, но регулярное выражение вызывает у меня сильную головную боль: (

import re


def saveresults(var):
    with open("email-lines.txt", 'a') as target:
        target.write(var+ '\n')
    target.close()
    print " line writed: ", var

file = "test.txt"

emaillines = [linie.rstrip('\n') for linie in open(file)]

for i in emaillines:
    a = re.findall(r"(^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,63}$)", i)
    print a

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 27 октября 2018

Используя регулярные выражения, вы можете использовать что-то вроде этого:

result = [] 
for line in emaillines:
    if re.search (r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,10}', line) is not None:
        result.append(line)

Проблемы с вашим регулярным выражением были:

  • [A-Z] соответствует только заглавным буквам
  • Каретка в начале была неправильной
  • Вы принудительно указали адрес электронной почты в конце строки с $

Я также изменил мощность с {2, 63} на {2, 10}. Вы позволяли кому-то поставить до 63 букв после точки. Может быть, это было сделано намеренно, измените это в этом случае.

Кроме того, вы можете сократить регулярное выражение до:

r'[\w.%+-]+@[a-zA-Z\d.-]+\.[a-zA-Z]{2,10}'
0 голосов
/ 27 октября 2018

Ваше регулярное выражение начинается с ^ (привязка начала строки) и заканчивается $ (привязка конца строки), что означает, что адрес электронной почты должен быть всей строкой, а на строка, чтобы регулярное выражение соответствовало. Вы также используете [A-Z], но не a-z, и не используете флаг без учета регистра, что означает, что строчные буквы в адресах электронной почты не будут работать.

Изменить на:

pattern = re.compile(r"(?i)[\w.%+-]+@[a-z\d.-]+\.[a-z]{2,63}")
for i in lines:
    if pattern.search(i):
        print(i)

(?i) делает регулярное выражение нечувствительным к регистру, а набор символов, содержащий [0-9A-Za-z_], означает, что в большинстве случаев все эти символы можно заменить на \w.

...