import re
regex = re.compile(r"^([a-zA-Z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?)$", flags=re.MULTILINE)
test_str = ("--------- valid ---------\n"
"something@something.com\n"
"someone@localhost.localdomain\n"
"someone@127.0.0.1\n"
"a@b.b\n"
"a/b@domain.com\n"
"{}@domain.com\n"
"m*'!%@something.sa\n"
"tu!!7n7.ad##0!!!@company.ca\n"
"%@com.com\n"
"!#$%&'*+/=?^_`{|}~.-@com.com\n"
"USER@EXAMPLE.COM\n"
"someone@do-ma-in.com\n"
"a@p.com\n\n"
"-------- invalid --------\n"
"somebody@example\n"
" a@p.com\n"
".wooly@example.com\n"
"wo..oly@example.com\n"
"invalid:email@example.com\n"
"@somewhere.com\n"
"example.com\n"
"@@example.com\n"
"a space@example.com\n"
"something@ex..ample.com\n"
"a\\b@c\n"
"----- empty string ----\n\n"
"-------- space --------\n"
" \n"
"someone@somewhere.com.\n"
"\\\"\\\"test\\blah\\\"\\\"@example.com\n"
"\\\"testblah\\\"@example.com\n"
"someone@somewhere.com@\n"
"someone@somewhere_com\n"
"someone@some:where.com\n"
".\n"
"F/s/f/a@feo+re.com\n"
"some+long+email+address@some+host-weird-/looking.com\n"
"a @p.com\n"
"a\\u0020@p.com\n"
"a\\u0009@p.com\n"
"a\\u000B@p.com\n"
"a\\u000C@p.com\n"
"a\\u2003@p.com\n"
"a\\u3000@p.com\n"
"ddjk-s-jk@asl-.com\n"
"someone@do-.com\n"
"somebody@-p.com\n"
"somebody@-.com")
matches = regex.finditer(test_str)
for match_num, match in enumerate(matches, start=1):
print(f"Match {match_num} was found at {match.start()}-{match.end()}: {match.group()}")
for group_num, group in enumerate(match.groups(), start=1):
print(f"Group {group_num} found at {match.start(group_num)}-{match.end(group_num)}: {group}")
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Python, please visit: https://docs.python.org/3/library/re.html