본문 바로가기
카테고리 없음

[파이썬] 정규 표현식(Regex) 문법 - ?, *, +의 차이점 정리

by 보눔비스타 2025. 2. 20.

다음 코드 예시는 특정 문자열에 'u'의 포함 여부 및 포함 횟수에 따라 해당 문자열이 패턴에 매치하는지 여부를 판별해주는 프로그램을 나타낸다.

import re

# 정규 표현식 패턴을 컴파일
patterns = [
    re.compile(r'colou?r'),  # u가 0번 또는 1번
    re.compile(r'colou*r'),   # u가 0번 이상
    re.compile(r'colou+r')    # u가 1번 이상
]

# 테스트 문자열
test_strings = [
    'color',     # "color"는 u가 없으므로 test case로 사용
    'colour',    # "colour"는 u가 1번 있음
    'colr',      # "colr"은 u가 없지만, 다른 경우에도 매칭될지 확인
    'colouur',   # "colouur"는 u가 2번 있음
    'colouuuur'  # "colouuuur"는 u가 4번 있음
]

# 각 패턴을 사용해 매칭 테스트 실행
for pattern in patterns:
    print(f"Testing pattern: {pattern.pattern}")
    for test_string in test_strings:
        match = pattern.match(test_string)
        result = "Match" if match else "No match"
        print(f"  {test_string}: {result}")
    print()

코드 출처: ChatGPT

 

코드 설명

pattern 속성

pattern.pattern은 정규 표현식 객체가 가지고 있는 속성(attribute) 중 하나로, 컴파일된 정규 표현식 패턴을 문자열로 반환한다.

즉, re.compile()을 사용하여 정규 표현식을 컴파일하면, 해당 정규 표현식이 Pattern 객체로 반환됩니다. 이 Pattern 객체에는 컴파일된 정규 표현식 패턴이 저장되어 있는데, pattern.pattern을 사용하면 원래의 문자열 형태로 정규 표현식 패턴을 출력할 수 있다.

 

다시 말해, 

pattern: re.compile(r'colou?r')로 컴파일된 Pattern 객체

pattern.pattern: 그 객체에 속한 속성으로, r'colou?r'라는 정규 표현식 문자열을 그대로 반환함.

 

요약하면,

pattern: 정규 표현식이 컴파일된 객체 (변수)

pattern.pattern: 해당 객체에 컴파일된 정규 표현식 패턴의 원본 문자열을 반환하는 속성

match() 메서드

match()는 정규 표현식 객체에서 제공하는 메서드로, 주어진 문자열의 시작 부분이 정규 표현식과 일치하는지 확인한다. 만약 문자열의 시작 부분에서 정규 표현식과 일치하는 부분을 찾으면, 일치하는 부분을 매칭 객체로 반환하고, 일치하지 않으면 None을 반환한다.

 

기본 사용법:

import re

pattern = re.compile(r'colou?r')  # 'colou?r' 정규 표현식 컴파일
result = pattern.match("colour")  # "colour" 문자열에서 매칭을 시도

if result:
    print("매칭됨:", result.group())  # 일치하는 부분 출력
else:
    print("매칭되지 않음")

 

동작 원리:

 

  • match()는 문자열 시작 부분만 검사한다.
  • 정규 표현식이 문자열의 첫 번째 문자부터 일치하면 match 객체를 반환한다.
  • 만약 첫 번째 문자부터 일치하지 않으면, None을 반환한다.

 

매칭 객체 (match 객체)

match()가 일치하는 부분을 찾으면, match 객체를 반환한다. 이 객체는 매칭된 문자열에 대한 여러 정보를 제공한다.

  • group(): 매칭된 문자열을 반환한다.
  • start(): 매칭된 문자열의 시작 인덱스를 반환한다.
  • end(): 매칭된 문자열의 끝 인덱스를 반환한다.
  • span(): 매칭된 문자열의 시작과 끝 인덱스를 튜플로 반환한다.

요약:

  • match(): 문자열의 시작 부분이 정규 표현식과 일치하는지 확인한다.
  • 일치하면 match 객체를 반환하고, 일치하지 않으면 None을 반환한다.
  • match 객체는 매칭된 부분에 대한 다양한 정보를 제공합니다 (group(), start(), end(), span() 등).

match()는 문자열의 시작 부분만 검사하는 데 유용하고, 만약 문자열 전체에서 패턴을 찾고 싶다면 **search()**를 사용해야 한다.

'''

코드 실행 결과

Testing pattern: colou?r
  color: Match
  colour: Match
  colr: No match
  colouur: No match
  colouuuur: No match

Testing pattern: colou*r
  color: Match
  colour: Match
  colr: Match
  colouur: Match
  colouuuur: Match

Testing pattern: colou+r
  color: No match
  colour: Match
  colr: No match
  colouur: Match
  colouuuur: Match

 

각 패턴 설명

  1. colou?r (re.compile(r'colou?r')):
    • u?는 u가 0번 또는 1번 있을 수 있다는 의미.
    • 매칭되는 문자열: "color", "colour"
    • 매칭되지 않는 문자열: "colr", "colouur", "colouuuur"
      • u가 두 번 이상 나타나는 경우에는 매칭되지 않음.
  2. colou*r (re.compile(r'colou*r')):
    • u*는 u가 0번 이상 나타날 수 있다는 의미.
    • 매칭되는 문자열: "color", "colour", "colr", "colouur", "colouuuur"
      • u가 없거나, 1번 이상 반복되어도 매칭됨.
  3. colou+r (re.compile(r'colou+r')):
    • u+는 u가 1번 이상 나타날 수 있다는 의미.
    • 매칭되는 문자열: "colour", "colouur", "colouuuur"
    • 매칭되지 않는 문자열: "color", "colr"
      • u가 하나 이상 있어야 하므로, "color"와 "colr"은 매칭되지 않음.

요약

  • ?: u가 0번 또는 1번 나타날 수 있음. ("color"와 "colour" 매칭)
  • *: u가 0번 이상 나타날 수 있음. ("color", "colour", "colr", "colouur", "colouuuur" 모두 매칭)
  • +: u가 1번 이상 나타날 수 있음. ("colour", "colouur", "colouuuur"만 매칭)