Извлечь субтитры электронной почты из большого документа
У меня есть очень большой файл .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)
Надеюсь, что это поможет.
Ответ 3
Если вы ищете определенный домен:
>>> import re
>>> text = "this is an email [email protected], it will be matched, [email protected] will not, and [email protected] will"
>>> match = re.findall(r'[\w-\._\+%][email protected]\.com',text) # replace test\.com with the domain you're looking for, adding a backslash before periods
>>> match
['[email protected]', '[email protected]']
Ответ 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]']
Ответ 7
import re
txt = 'hello from [email protected] to [email protected] about the meeting @2PM'
email =re.findall('\[email protected]\S+',s)
print(email)
Печатная продукция:
['[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 по электронной почте только после его вызова.