파이썬은 정규 표현식(regular expression)을 활용한 두 가지 기본 연산을 제공합니다.
- re.match() — 문자열의 맨 앞부분에서만 패턴이 일치하는지 검사합니다.
- re.search() — 문자열 어느 위치에서든 패턴이 일치하는지 검사합니다. 이는 Perl이 기본적으로 수행하는 방식과 동일합니다.
두 함수의 동작 차이는 실제 예제를 통해 더 명확하게 이해할 수 있습니다.
예제 코드
아래 예제에서는 동일한 문자열과 패턴('dogs')에 대해 match()와 search()를 각각 호출하여 그 결과를 비교합니다.
#!/usr/bin/python
import re
line = "Cats are smarter than dogs"
# match: 문자열 시작 부분에서만 검사
matchObj = re.match(r'dogs', line, re.M | re.I)
if matchObj:
print("match --> matchObj.group():", matchObj.group())
else:
print("No match!!")
# search: 문자열 전체에서 검사
searchObj = re.search(r'dogs', line, re.M | re.I)
if searchObj:
print("search --> searchObj.group():", searchObj.group())
else:
print("Nothing found!!")
실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
No match!! search --> searchObj.group(): dogs
결과 분석
출력 결과를 보면 두 함수의 차이가 분명하게 드러납니다.
- match()는 문자열이 반드시 패턴으로 시작해야 일치로 판단하기 때문에, "Cats are smarter than dogs"라는 문자열은 'dogs'로 시작하지 않으므로 매칭에 실패합니다.
- search()는 문자열 전체를 스캔하므로 문장 중간에 있는 'dogs'를 성공적으로 찾아냅니다.
참고로 예제에서 사용된 플래그 중 re.I(IGNORECASE)는 대소문자를 구분하지 않도록 하며, re.M(MULTILINE)은 여러 줄 문자열에서 각 줄의 시작과 끝을 기준으로 매칭할 수 있게 해줍니다. 따라서 문자열의 시작 부분부터 패턴을 찾으려면 match(), 특정 패턴이 어디든 등장하기만 하면 되는 경우에는 search()를 사용하는 것이 적절합니다.