Извлечь субтитры электронной почты из большого документа

У меня есть очень большой файл .txt с сотнями тысяч адресов электронной почты, разбросанных по всему миру. Все они принимают формат:

...<[email protected]>...

Каков наилучший способ заставить Python перебирать весь файл .txt, ища все экземпляры определенной строки @domain, а затем захватить всю полноту адреса внутри <... > 's, и добавить его в список? У меня есть проблема с переменной длиной разных адресов.

Ответ 1

Этот код извлекает адреса электронной почты в строке. Используйте его во время чтения строки за строкой

>>> import re
>>> line = "should we use regex more often? let me know at  [email protected]"
>>> match = re.search(r'[\w\.-][email protected][\w\.-]+', line)
>>> match.group(0)
'[email protected]'

Если у вас несколько адресов электронной почты, используйте findall:

>>> line = "should we use regex more often? let me know at  [email protected]"
>>> match = re.findall(r'[\w\.-][email protected][\w\.-]+', line)
>>> match
['[email protected]', '[email protected]']

Повторное выражение выше, вероятно, находит наиболее распространенный не поддельный адрес электронной почты. Если вы хотите полностью выровняться с RFC 5322, вы должны проверить, какие адреса электронной почты соответствуют спецификации. Проверьте этот, чтобы избежать ошибок в поиске адресов электронной почты.


Изменить:, как было предложено в комментарии @kostek: В строке Contact us at [email protected] мое регулярное выражение возвращает [email protected] (с точкой в ​​конце). Чтобы избежать этого, используйте [\w\.,][email protected][\w\.,]+\.\w+)

Edit II: в комментариях было упомянуто еще одно замечательное улучшение: [\w\.-][email protected][\w\.-]+\.\w+, который также будет захватывать [email protected]

Ответ 2

Вы также можете использовать следующие, чтобы найти все адреса электронной почты в тексте и распечатать их в массиве или в каждом письме в отдельной строке.

import re
line = "why people don't know what regex are? let me know asdfal2[email protected], [email protected] " \
       "[email protected],[email protected]"
match = re.findall(r'[\w\.-][email protected][\w\.-]+', line)
for i in match:
    print(i)

Если вы хотите добавить его в список, просто распечатайте "match"

это напечатает список

print(match)

Надеюсь, что это поможет.

Ответ 4

import re
rgx = r'(?:\.?)([\w\-_+#~!$&\'\.]+(?<!\.)(@|[ ]?\(?[ ]?(at|AT)[ ]?\)?[ ]?)(?<!\.)[\w]+[\w\-\.]*\.[a-zA-Z-]{2,3})(?:[^\w])'
matches = re.findall(rgx, text)
get_first_group = lambda y: list(map(lambda x: x[0], y))
emails = get_first_group(matches)

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

enter image description here

Не стесняйтесь поиграть с этим здесь

Я также сделал вариант, когда регулярное выражение захватывает электронные письма, такие как name at example.com

(?:\.?)([\w\-_+#~!$&\'\.]+(?<!\.)(@|[ ]\(?[ ]?(at|AT)[ ]?\)?[ ])(?<!\.)[\w]+[\w\-\.]*\.[a-zA-Z-]{2,3})(?:[^\w])

Ответ 5

import re
with open("file_name",'r') as f:
    s = f.read()
    result = re.findall(r'\[email protected]\S+',s)
    for r in result:
        print(r)

Ответ 6

Здесь другой подход для этой конкретной проблемы с регулярным выражением emailregex.com:

text = "blabla <[email protected]>><[email protected]> <[email protected]> bla bla <[email protected]>"

# 1. find all potential email addresses (note: < inside <> is a problem)
matches = re.findall('<\S+?>', text)  # ['<[email protected]>', '<[email protected]>', '<[email protected]>', '<[email protected]>']

# 2. apply email regex pattern to string inside <>
emails = [ x[1:-1] for x in matches if re.match(r"(^[a-zA-Z0-9_.+-][email protected][a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$)", x[1:-1]) ]
print emails   # ['[email protected]', '[email protected]', '[email protected]']

Ответ 8

import re
mess = '''[email protected] [email protected]
            [email protected]'''
email = re.compile(r'([\w\.-][email protected])')
result= email.findall(mess)

if(result != None):
    print(result)

Приведенный выше код поможет вам и принесет Gmail по электронной почте только после его вызова.