Python 기초강의: #23 정규 표현식(3) - 문자열 패턴 매칭
정규표현식(Regular Expression, RegEx)은 문자열에서 특정 패턴을 찾거나, 일치 여부를 검사하거나, 치환할 때 사용되는 강력한 도구입니다. 파이썬에서는 re 모듈을 사용하여 정규표현식을 처리할 수 있습니다. 이 포스팅에서는 파이썬에서 정규표현식을 이용하여 문자열 패턴을 매칭하는 방법과 몇 가지 예제를 소개하겠습니다.
1. 복습 - 파이썬 re 모듈
이전 포스팅에서 살펴봤던 re 모듈에 대해 다시 살짝 살펴보고 가겠습니다. 파이썬에서 정규표현식을 사용하려면 re 모듈을 import 해야 합니다. re 모듈의 주요 함수는 다음과 같습니다.
- re.match(): 문자열의 시작에서 패턴을 찾습니다.
- re.search(): 문자열 전체에서 패턴을 찾습니다.
- re.findall(): 패턴과 일치하는 모든 부분을 리스트로 반환합니다.
- re.sub(): 패턴과 일치하는 부분을 다른 문자열로 치환합니다.
2. 예제 코드
re 모듈에 있는 주요 함수에 대한 예제를 살펴보겠습니다. 각각을 작성해 보시면서 어떻게 동작하는지 확인하시면 좋겠습니다.
re.match()
match 함수를 사용해 보겠습니다. text 문자열 내부에 hello라는 패턴을 찾기 위해 re.match() 함수를 사용하는 예제를 작성해 보겠습니다. match 함수는 문자열의 "처음"부터 일치하는지 여부를 확인하여 반환합니다.
import re
pattern = r'hello'
text = 'hello world'
match = re.match(pattern, text)
if match:
print("Match found!")
else:
print("No match.")
re.search()
search 함수를 사용해 보겠습니다. text 문자열 내부에 hello 라는 패턴을 찾기 위해 re.search() 함수를 사용하는 예제를 작성해 보겠습니다. search 함수는 문자열의 처음부터 일치할 필요 없이 문자열 내부 어디에서든 패턴이 있는지 찾는 함수입니다.
import re
pattern = r'world'
text = 'hello world'
search = re.search(pattern, text)
if search:
print("Match found!")
else:
print("No match.")
re.findall()
findall 함수는 패턴과 매칭되는 모든 부분을 찾는 함수입니다. 아래 예제는 text 문자열에서 숫자 패턴이 있는 모든 부분을 찾는 예제입니다. re.findall() 함수가 두 개의 숫자 즉, 123, 456을 찾아 리스트로 반환하는 것을 확인할 수 있습니다.
import re
pattern = r'\d+'
text = 'There are 123 apples and 456 oranges.'
numbers = re.findall(pattern, text)
print(numbers) # Output: ['123', '456']
re.sub()
sub 함수를 사용해 보겠습니다. sub 함수는 문자열을 치환하는 함수로 아래 형식을 따릅니다. text 내부에서 pattern을 찾아서 relacement로 대체한다는 의미입니다.
re.sub(pattern, replace, text)
아래 예제는 text 문자열 내부에 'apples'를 'bananas'로 치환하는 예제입니다.
import re
pattern = r'apples'
replacement = 'bananas'
text = 'I have apples.'
new_text = re.sub(pattern, replacement, text)
print(new_text) # Output: 'I have bananas.'
3. 복잡한 예제
이제 조금은 프로그래밍스러운(?) 예제를 작성해보겠습니다. 현장에서 개발을 수행하면 아래와 같은 코드를 작성해 보시는 게 도움이 더 되실 것입니다.
이메일 주소 검증
웹 사이트 등에 회원가입을 할 때 거의 필수로 사용하는 코드입니다. 여러분도 실제로 회원가입을 수행할 때 '잘못된 이메일 형식입니다'라는 메시지를 많이 받으셨을 것입니다. 잘못된 이메일 형식을 알아내는 것이 바로 정규표현식입니다.
import re
pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
text = 'example@example.com'
if re.match(pattern, text):
print("Valid email address.")
else:
print("Invalid email address.")
패턴에 대해서 잠시 설명드리겠습니다.
- '^[a-zA-Z0-9._%+-]+'는 영문 대/소문자와 숫자 그리고 '.', '_', '%', '+', '-' 의 5 가지 특수기호로 구성된 문자열로 시작한다는 의미입니다. 여러분의 아이디 검증 부분입니다.
- '[a-zA-Z0-9.-]+'는 영문 대/소문자와 숫자 그리고 '.', '_'의 2 가지 특수기호로 구성된 문자열을 의미합니다. 여기서는 웹사이트 주소 예를 들어 'gmail'과 같은 문자열을 검증합니다.
- '.'는 .을 의미합니다. \는 이스케이프로 .이 메타문자로 사용되는 것이 아니라 단순한 온점을 검색하고자 할 때 .의 형식으로 사용합니다.
- '[a-zA-Z]{2,}$'는 영문 대/소문자로 구성되는 문자열이고 길이는 2 이상이라는 의미입니다. 즉, 'kr', 'com' 등의 문자열에 대해 검증하는 정규표현식입니다.
어때요? 조금 이해가 가시나요? ㅎㅎㅎ 아래의 예제들은 직접 의미를 추론해 보시면 좋겠습니다. 실제로 예제를 뜯어보고 작성해 봄으로써 더 깊은 이해가 가능합니다. 귀찮고 힘드시겠지만 부탁드리겠습니다.
전화번호 추출
전화번호를 추출하는 코드입니다. 조금 복잡하지만 추론이 가능할 것으로 생각합니다.
import re
pattern = r'\b\d{3}[-.]?\d{3}[-.]?\d{4}\b'
text = 'Contact us at 123-456-7890 or 987.654.3210.'
phone_numbers = re.findall(pattern, text)
print(phone_numbers) # Output: ['123-456-7890', '987.654.3210']
HTML 태그 제거
정규표현식을 이용하면 특정 문자열의 패턴을 검색하고 원하는 부분은 제거할 수도 있습니다. 아래의 예제는 html에서 태그를 제거하고 내용만 추출하는 예제 코드입니다.
import re
pattern = r'<.*?>'
text = '<html><body>Hello, world!</body></html>'
clean_text = re.sub(pattern, '', text)
print(clean_text) # Output: 'Hello, world!'
결론
파이썬의 re 모듈을 사용하면 정규표현식을 통해 문자열에서 원하는 패턴을 쉽게 찾고 조작할 수 있습니다. 위 예제들을 통해 기본적인 사용법을 익히고, 필요에 따라 복잡한 정규표현식을 작성하여 다양한 문자열 처리 작업에 활용해 보세요. 정규표현식을 잘 활용하면 문자열 처리 작업의 효율성을 크게 높일 수 있습니다.
실제 문자열을 처리하는 경우가 많은 곳은 여러 작업이 있겠지만 저의 경우 파일 이름 처리에 많이 사용합니다. 수많은 파일의 이름이 형식을 갖추고 있어 특정 패턴만으로 한꺼번에 작업이 가능하기 때문입니다. 따라서 패턴이 있는 경우에 파일 작업을 배치로 수행할 수 있기 때문에 정규표현식은 굉장히 유용한 기능으로 활용됩니다. 여러분도 정규표현식을 통해 여러 작업들을 수월하게 해 보시면 좋겠습니다.
감사합니다!