TITEDIOS 편한 코딩

Python 기초강의: #22 정규 표현식(2) - 메타문자 본문

파이썬

Python 기초강의: #22 정규 표현식(2) - 메타문자

TitediosKW 2024. 7. 14. 19:00
반응형


정규표현식의 기본 구성 요소는 메타문자입니다. 메타문자는 특별한 의미를 가지며, 다양한 문자열 패턴을 표현할 수 있게 해줍니다. 이번 포스팅에서는 메타문자에 대해 알아보겠습니다.

메타문자에 대해 모두 암기하실 필요는 없습니다. 그때 그때 찾아보시면 되겠습니다. 이 포스팅을 읽고 예제를 확인하시면서 하나하나의 의미를 잘 알아두시면 도움이 많이 되실 것입니다.

1. 메타문자란?

메타문자는 정규표현식에서 특별한 의미를 갖는 문자입니다. 메타문자는 검사 범위를 자동 또는 수동으로 지정하거나 문자열의 수량 및 위치 등에 대한 정보를 나타내는 등 여러 기능을 가진 문자입니다.

2. 메타문자의 종류

검사 범위(자동)

패턴
설명
. 줄바꿈(\n)을 제외한 임의의 문자
\s 화이트스페이스(whitespace) 문자. [ \t\n\r\f\v]와 동일한 표현식. 맨 앞의 빈칸은 공백을 의미
\S 화이트스페이스 문자가 아닌 것과 매치. [^ \t\n\r\f\v]와 동일한 표현식
\d 숫자와 매치. [0-9]와 동일한 표현식
\D 숫자가 아닌 것과 매치. [^0-9]와 동일한 표현식
\w 문자+숫자(alphanumeric). [a-zA-Z0-9_]와 동일
\W 문자+숫자(alphanumeric)가 아닌 문자.[^a-zA-Z0-9_]와 동일

검사 문범위(수동)

패턴
설명
[abc] abc 문자 중 하나와 매치
[^abc] abc가 아닌 문자 중 하나와 매치
(abc) 매칭된 부분(abc) 문자열을 캡처하고 저장
(?:abc) 매칭된 부분 문자열을 캡처하지 않음. 단순히 그룹화를 위해 사용되며, 성능 상 이점
a|bc a 또는 bc 와 매치

검사 위치 지정

패턴
설명
^ 문자열의 시작
$ 문자열의 마지막
\b 단어 경계. 단어 경계는 단어의 시작이나 끝을 의미
\B 비단어 경계. 단어 내부의 경계를 의미
(?=) 긍정형 전방탐색. (?=pattern)으로 사용. pattern이 뒤따라 오는지 확인
(?!) 부정형 전방탐색. (?!pattern)으로 사용. pattern이 뒤에 없는 것을 확인
(?<=) 긍정형 후방탐색. (?<=pattern)으로 사용. pattern이 앞에 오는지 확인
(?<!) 부정형 후방탐색. (?<!pattern)으로 사용. pattern이 앞에 없는 것을 확인

수량 지정

패턴
설명
* 0개 이상. {0,}과 동일
+ 1개 이상. {1,}과 동일
? 0 또는 1개. {0, 1}과 동일
{n} n 개
{n,} n 개 이상
{,n} 0 개를 포함 n 개 이하
{m,n} m개 이상, n개 이하

3. 메타문자 예제

앞서 살펴본 메타문자에 대한 간단한 예제를 하나 작성해보죠ㅎㅎ. 정규표현식을 사용하여 날짜 형식을 검증하는 예제를 작성해 보겠습니다. 날짜 형식은 보통 YYYY-MM-DD, MM/DD/YYYY, DD-MM-YYYY 등 다양한 형식이 있습니다. 여기서는 YYYY-MM-DD 형식을 검증하는 정규표현식을 작성하겠습니다.

import re

# 날짜 형식을 검증하는 정규표현식 패턴 (YYYY-MM-DD)
date_pattern = r'^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$'

# 테스트할 날짜 목록
dates = [
    '2024-07-09',
    '2023-02-29',  # Invalid date, 2023 is not a leap year
    '2020-02-29',  # Valid date, 2020 is a leap year
    '2019-13-01',  # Invalid month
    '2018-12-32',  # Invalid day
    '2021-04-31',  # Invalid day, April has 30 days
    '2022-06-15',
    '2021-11-30',
    '2021-00-10',  # Invalid month
    'abcd-ef-gh'   # Invalid format
]

# 날짜 형식 검증 함수
def validate_date(date):
    return re.match(date_pattern, date) is not None

# 테스트
for date in dates:
    if validate_date(date):
        print(f"'{date}' is a valid date.")
    else:
        print(f"'{date}' is not a valid date.")

정규표현식 설명

  • ^ : 문자열의 시작을 나타냅니다.
  • \d{4} : 숫자 4개가 연속으로 나오는 것을 의미합니다 (년도를 나타냅니다).
  • - : '-' 문자 자체를 의미합니다.
  • (0[1-9]|1[0-2]) : 01에서 09 또는 10에서 12 사이의 값을 의미합니다 (월을 나타냅니다).
  • - : '-' 문자 자체를 의미합니다.
  • (0[1-9]|[12]\d|3[01]) : 01에서 09, 10에서 29, 30에서 31 사이의 값을 의미합니다 (일을 나타냅니다).
  • $ : 문자열의 끝을 나타냅니다.

결론

정규표현식의 메타문자는 문자열 패턴을 정의하고 찾는 데 매우 유용한 도구입니다. 다양한 메타문자를 활용하여 문자열 검색, 매칭, 치환 작업을 효율적으로 수행할 수 있습니다. 이 포스팅에서 소개한 메타문자를 익혀서, 다양한 문자열 처리 작업에 적용해 보시면 좋겠습니다. 정규표현식을 잘 활용하면 복잡한 문자열 패턴도 손쉽게 다룰 수 있기 때문에 실무에서 유용하게 활용될 수 있을 것입니다.

이번 포스팅은 좀 어려울 수 있지만 사전으로 활용한다고 생각하시면 좋겠습니다. 필요하실 때마다 살펴보시면서 프로그래밍을 하신다면 충분할 것 같습니다. 아무쪼록 도움이 되시길 바랍니다.

감사합니다!

반응형