Skip to content

Instantly share code, notes, and snippets.

@joskid
Forked from dideler/example.md
Created February 3, 2021 20:15
Show Gist options
  • Save joskid/66bb2457c3363b15949de7f4d985da1c to your computer and use it in GitHub Desktop.
Save joskid/66bb2457c3363b15949de7f4d985da1c to your computer and use it in GitHub Desktop.
A python script for extracting email addresses from text files.You can pass it multiple files. It prints the email addresses to stdout, one address per line.For ease of use, remove the .py extension and place it in your $PATH (e.g. /usr/local/bin/) to run it like a built-in command.

The program below can take one or more plain text files as input. It works with python2 and python3.

Let's say we have two files that may contain email addresses.

file_a.txt

foo bar
ok [email protected] sup
 [email protected],wyd
hello world!

RESCHEDULE 2'OCLOCK WITH [email protected] FOR TOMORROW@3pm

file_b.html

<html>
<body>
  <ul>
    <li><span class=pl-c>Dennis Ideler &lt;[email protected]&gt;</span></li>
    <li><span class=pl-c>Jane Doe &lt;[email protected]&gt;</span></li>
  </ul>
</body>
</html>

To extract the email addresses, download the Python program and execute it on the command line with our files as input.

$ python extract_emails_from_text.py file_a.txt file_b.html
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]

Voila, it prints all found email addresses. Let's also remove the duplicates and sort the email addresses alphabetically.

$ python extract_emails_from_text.py file_a.txt file_b.html | sort | uniq
[email protected]
[email protected]
[email protected]
[email protected]

Looks good! Now let's save the results to a file.

$ python extract_emails_from_text.py file_a.txt file_b.html | sort | uniq > emails.txt

P.S. The above commands for sorting and deduplicating are specific to shells on a UNIX-based machine (e.g. Linux or Mac). If you're using Windows, you can use PowerShell. For example

python extract_emails_from_text.py file_a.txt file_b.html | sort -unique
#!/usr/bin/env python
#
# Extracts email addresses from one or more plain text files.
#
# Notes:
# - Does not save to file (pipe the output to a file if you want it saved).
# - Does not check for duplicates (which can easily be done in the terminal).
#
# (c) 2013 Dennis Ideler <[email protected]>
from optparse import OptionParser
import os.path
import re
regex = re.compile(("([a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`"
"{|}~-]+)*(@|\sat\s)(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(\.|"
"\sdot\s))+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)"))
def file_to_str(filename):
"""Returns the contents of filename as a string."""
with open(filename) as f:
return f.read().lower() # Case is lowered to prevent regex mismatches.
def get_emails(s):
"""Returns an iterator of matched emails found in string s."""
# Removing lines that start with '//' because the regular expression
# mistakenly matches patterns like 'http://[email protected]' as '//[email protected]'.
return (email[0] for email in re.findall(regex, s) if not email[0].startswith('//'))
if __name__ == '__main__':
parser = OptionParser(usage="Usage: python %prog [FILE]...")
# No options added yet. Add them here if you ever need them.
options, args = parser.parse_args()
if not args:
parser.print_usage()
exit(1)
for arg in args:
if os.path.isfile(arg):
for email in get_emails(file_to_str(arg)):
print(email)
else:
print('"{}" is not a file.'.format(arg))
parser.print_usage()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment