python print Estrai sotto-stringhe e-mail dal documento di grandi dimensioni




string[< in>] python (5)

Questo code estrae gli indirizzi e-mail in una stringa. Usalo mentre leggi riga per riga

>>> 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]'

Se hai diversi indirizzi email usa la 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]']

L'espressione regolare sopra trova probabilmente l'indirizzo email non falso più comune. Se si desidera essere completamente allineati con RFC 5322, è necessario verificare quali indirizzi e-mail seguono le specifiche. Controlla this per evitare eventuali errori nella ricerca di indirizzi email correttamente.

Modifica: come suggerito in un commento di @kostek : Nella stringa Contact us at [email protected] la mia regex restituisce [email protected] (con punto alla fine). Per evitare ciò, usa [\w\.,][email protected][\w\.,]+\.\w+)

Modifica II: un altro miglioramento meraviglioso è stato menzionato nei commenti: [\w\.-][email protected][\w\.-]+\.\w+ che catturerà pure [email protected]

Ho un file .txt molto grande con centinaia di migliaia di indirizzi e-mail sparsi ovunque. Tutti prendono il formato:

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

Qual è il modo migliore per fare in modo che Python riesca a scorrere l'intero file .txt alla ricerca di tutte le istanze di una determinata stringa @domain, quindi prendere l'intero indirizzo all'interno di <...> e aggiungerlo a una lista? Il problema che ho è con la lunghezza variabile di diversi indirizzi.



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)

Per favore non odiarmi per aver provato questa infame regex. La regex funziona per una buona porzione di indirizzi email mostrati sotto. Ho usato principalmente questo come base per i caratteri validi in un indirizzo email.

Sentiti libero di giocarci qui

Ho anche realizzato una variazione in cui la regex cattura le email come name at example.com

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

Ecco un altro approccio per questo problema specifico, con una regex da 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]']

È inoltre possibile utilizzare quanto segue per trovare tutti gli indirizzi e-mail in un testo e stamparli in un array o ogni e-mail su una riga separata.

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

Se vuoi aggiungerlo a una lista, stampa la "partita"

questo stamperà la lista

print(match)

Spero che questo ti aiuti.







string