이메일 주소는 상당히 복잡한 구조를 가지고 있으며, 전 세계적으로 통일된 단일 표준이 존재하지 않기 때문에 정규식(regex)으로 이메일을 정확하게 식별하는 것이 쉽지 않습니다. 다행히 RFC 5322 문서가 이메일 주소의 형식을 규정하고 있으며, 이 형식을 기반으로 텍스트에서 이메일 주소를 추출할 수 있습니다.
예시 입력과 기대 출력
예를 들어 다음과 같은 입력 문자열이 있다고 가정해 보겠습니다.
Hi my name is John and email address is john.doe@somecompany.co.uk and my friend's email is jane_doe124@gmail.com
이 문자열에서 다음과 같은 결과를 얻어야 합니다.
john.doe@somecompany.co.uk jane_doe124@gmail.com
사용할 정규식 패턴
이메일 주소를 추출하기 위해 아래와 같은 정규식 패턴을 사용할 수 있습니다.
[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+
이 패턴의 구조를 살펴보면 다음과 같습니다.
[a-zA-Z0-9_.+-]+: @ 앞부분(로컬 파트)으로, 영문 대소문자, 숫자, 밑줄(_), 마침표(.), 더하기(+), 하이픈(-)을 허용합니다.@: 이메일 주소에서 필수적인 @ 기호입니다.[a-zA-Z0-9-]+: 도메인 이름 부분입니다.\.[a-zA-Z0-9-.]+: 마침표 뒤에 오는 최상위 도메인(TLD) 및 하위 도메인 부분입니다.
Python 코드 예제
Python의 re 모듈에서 제공하는 findall() 메서드를 사용하면 문자열 내의 모든 이메일 주소를 손쉽게 추출할 수 있습니다.
import re
my_str = "Hi my name is John and email address is john.doe@somecompany.co.uk and my friend's email is jane_doe124@gmail.com"
emails = re.findall(r"([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+)", my_str)
for mail in emails:
print(mail)실행 결과
위 코드를 실행하면 다음과 같은 출력을 얻을 수 있습니다.
john.doe@somecompany.co.uk jane_doe124@gmail.com
참고 사항
findall()은 패턴과 일치하는 모든 문자열을 리스트 형태로 반환하므로, 반복문을 통해 각 이메일 주소에 접근할 수 있습니다. 또한 정규식 문자열 앞에 r(raw string)를 붙이면 백슬래시 이스케이프 처리 문제를 피할 수 있어 더 안전합니다.
다만 위 패턴은 대부분의 일반적인 경우에 잘 작동하지만, RFC 5322가 허용하는 모든 극단적인 이메일 형식(예: 따옴표로 묶인 로컬 파트 등)까지 완벽하게 커버하지는 못한다는 점을 유의해야 합니다. 실무에서는 대부분의 이메일이 표준적인 형식을 따르므로 이 정도의 패턴으로 충분히 실용적입니다.