정규식이 일부만 맞아도 통과할 때, 파이썬 re.fullmatch

이 카테고리 글 목록

전체글 보기

입력 전체가 정해진 형식이어야 한다면 re.fullmatch()를 쓰세요. 예를 들어 상품 코드가 AB-042처럼 영문 대문자 두 글자, 하이픈, 숫자 세 자리로만 이루어져야 한다면 re.match()는 AB-042x도 통과시킬 수 있습니다. 시작 부분의 AB-042가 이미 패턴에 맞기 때문입니다.

같은 패턴에서 검사 범위만 바꾸기

아래 가상 코드 네 개는 정상 입력과 앞이나 뒤에 문자가 붙은 경우, 맨 끝에 줄바꿈이 있는 경우입니다. !r로 입력을 출력해 눈에 보이지 않는 줄바꿈도 구분합니다.

import re

pattern = r"[A-Z]{2}-[0-9]{3}"
for code in ("AB-042", "AB-042x", "xAB-042", "AB-042\n"):
    at_start = re.match(pattern, code) is not None
    anywhere = re.search(pattern, code) is not None
    whole = re.fullmatch(pattern, code) is not None
    print(f"{code!r} match={at_start} search={anywhere} fullmatch={whole}")
'AB-042' match=True search=True fullmatch=True
'AB-042x' match=True search=True fullmatch=False
'xAB-042' match=False search=True fullmatch=False
'AB-042\n' match=True search=True fullmatch=False

앞부분에서 코드를 꺼낼 때는 match(), 문장 안 어디든 코드가 있는지 찾을 때는 search()가 맞습니다. 위 규칙대로 상품 코드 하나를 입력받았다면 앞뒤의 여분 문자도 검사에 포함하는 fullmatch()가 맞습니다. 이 예제의 패턴은 숫자 자리에 ASCII 0부터 9까지만 허용합니다. 파이썬의 문자열 패턴에서 \d는 기본적으로 다른 유니코드 십진 숫자도 포함합니다.

줄바꿈은 특히 놓치기 쉽습니다. 파이썬 정규식의 $는 문자열 끝과 마지막 줄바꿈 바로 앞에 일치할 수 있습니다. 위 패턴으로 전체를 검사할 때 fullmatch()를 쓰면 끝의 줄바꿈도 입력의 일부로 다룹니다.

예제는 Windows의 Python 3.14.3에서 기본 플래그로 실행했습니다. Python의 search, match, fullmatch 비교와 정규식 문법의 숫자 클래스와 줄 끝 규칙에서 세부 동작을 확인할 수 있습니다.

이 카테고리의 다른 글

전체글 보기

댓글 남기기