정규 표현식(Regular Expression, Regex)은 문자열에서 특정 패턴을 검색, 치환, 추출할 때 사용하는 강력한 도구입니다. 파이썬에서는 re 모듈을 통해 정규식을 손쉽게 활용할 수 있으며, 데이터 처리나 텍스트 분석 업무에서 필수적인 기술입니다.
이 글에서는 파이썬 정규식의 핵심 문법을 카테고리별로 나누고, 각 패턴이 어떻게 동작하는지 예제와 함께 정리했습니다.
1. 리터럴(Literal) 문자
리터럴 문자는 특별한 의미 없이 문자 그대로 일치하는 패턴입니다.
| 번호 | 예제 및 설명 |
|---|---|
| 1 | python 문자열 "python" 그 자체와 일치합니다. |
2. 문자 클래스(Character Classes)
대괄호 []를 사용하면 여러 문자 중 하나와 일치시킬 수 있습니다.
| 번호 | 예제 및 설명 |
|---|---|
| 1 | [Pp]ython "Python" 또는 "python"과 일치 |
| 2 | rub[ye] "ruby" 또는 "rube"와 일치 |
| 3 | [aeiou] 소문자 모음 하나와 일치 |
| 4 | [0-9] 임의의 숫자 하나와 일치 ([0123456789]와 동일) |
| 5 | [a-z] 임의의 소문자 알파벳과 일치 |
| 6 | [A-Z] 임의의 대문자 알파벳과 일치 |
| 7 | [a-zA-Z0-9] 위의 모든 문자(영문 대소문자, 숫자)와 일치 |
| 8 | [^aeiou] 소문자 모음을 제외한 임의의 문자와 일치 |
| 9 | [^0-9] 숫자를 제외한 임의의 문자와 일치 |
3. 특수 문자 클래스
자주 사용되는 문자 집합은 미리 정의된 축약형으로 제공됩니다.
| 번호 | 예제 및 설명 |
|---|---|
| 1 | . 줄바꿈(newline)을 제외한 임의의 한 문자와 일치 |
| 2 | \d 숫자 하나와 일치: [0-9] |
| 3 | \D 숫자가 아닌 문자와 일치: [^0-9] |
| 4 | \s 공백 문자와 일치: [ \t\r\n\f] |
| 5 | \S 공백이 아닌 문자와 일치: [^ \t\r\n\f] |
| 6 | \w 단어 문자 하나와 일치: [A-Za-z0-9_] |
| 7 | \W 단어 문자가 아닌 문자와 일치: [^A-Za-z0-9_] |
4. 반복 패턴(Repetition)
수량자(quantifier)를 사용하면 앞의 문자나 그룹이 반복되는 횟수를 지정할 수 있습니다.
| 번호 | 예제 및 설명 |
|---|---|
| 1 | ruby? "rub" 또는 "ruby"와 일치 (y는 0번 또는 1번 출현, 즉 선택 사항) |
| 2 | ruby* "rub" 뒤에 y가 0개 이상 붙는 패턴과 일치 |
| 3 | ruby+ "rub" 뒤에 y가 1개 이상 붙는 패턴과 일치 |
| 4 | \d{3} 정확히 3자리 숫자와 일치 |
| 5 | \d{3} 3자리 이상의 숫자와 일치 |
| 6 | \d{3,5} 3~5자리 숫자와 일치 |
5. 비탐욕적(Non-greedy) 반복
기본 반복은 가능한 한 많이 일치시키는 '탐욕적(greedy)' 방식입니다. 수량자 뒤에 ?를 붙이면 가장 적은 수의 반복만 일치시키는 '비탐욕적' 방식으로 동작합니다.
| 번호 | 예제 및 설명 |
|---|---|
| 1 | <.*> 탐욕적 반복: "<python>perl>" 문자열에서 <python>perl> 전체와 일치 |
| 2 | <.*?> 비탐욕적 반복: 같은 문자열에서 첫 번째 닫는 괄호까지만, 즉 "<python>"만 일치 |
6. 괄호를 이용한 그룹화(Grouping)
소괄호 ()로 패턴을 묶으면 수량자가 그룹 전체에 적용됩니다.
| 번호 | 예제 및 설명 |
|---|---|
| 1 | \D\d+ 그룹 없음: + 수량자가 \d에만 적용됨 |
| 2 | (\D\d)+ 그룹 지정: + 수량자가 \D\d 쌍 전체에 적용됨 |
| 3 | ([Pp]ython(, )?)+ "Python", "Python, python, python" 등 반복되는 패턴과 일치 |
7. 역참조(Backreferences)
역참조는 앞서 매칭된 그룹과 동일한 내용을 다시 한번 일치시킬 때 사용합니다.
| 번호 | 예제 및 설명 |
|---|---|
| 1 | ([Pp])ython&\1ails "python&pails" 또는 "Python&Pails"와 일치 (\1이 첫 그룹과 동일한 문자를 재사용) |
| 2 | (['"])[^\1]*\1 작은따옴표 또는 큰따옴표로 감싸인 문자열과 일치. \1은 첫 번째 그룹이 매칭한 문자(따옴표), \2는 두 번째 그룹의 결과를 다시 참조하는 식으로 동작합니다. |
8. 선택(Alternatives)
|(OR 연산자)를 사용하면 여러 패턴 중 하나와 일치시킬 수 있습니다.
| 번호 | 예제 및 설명 |
|---|---|
| 1 | python|perl "python" 또는 "perl"과 일치 |
| 2 | rub(y|le) "ruby" 또는 "ruble"과 일치 |
| 3 | Python(!+|\?) "Python" 뒤에 느낌표(!)가 하나 이상 오거나 물음표(?)가 하나 오는 경우와 일치 |
9. 앵커(Anchors)
앵커는 문자 자체가 아닌 매칭 위치를 지정할 때 사용합니다.
| 번호 | 예제 및 설명 |
|---|---|
| 1 | ^Python 문자열의 시작 또는 내부 줄의 시작에 있는 "Python"과 일치 |
| 2 | Python$ 문자열 또는 줄의 끝에 있는 "Python"과 일치 |
| 3 | \APython 문자열 전체의 시작에 있는 "Python"과 일치 |
| 4 | Python\Z 문자열 전체의 끝에 있는 "Python"과 일치 |
| 5 | \bPython\b 단어 경계(word boundary)에 있는 "Python"과 일치 |
| 6 | \brub\B \B는 단어 경계가 아닌 위치를 의미: "rube", "ruby" 안의 "rub"과는 일치하지만 독립된 "rub"에는 일치하지 않음 |
| 7 | Python(?=!) 긍정형 전방 탐색: 바로 뒤에 느낌표(!)가 있을 때만 "Python"과 일치 |
| 8 | Python(?!!) 부정형 전방 탐색: 바로 뒤에 느낌표(!)가 없을 때만 "Python"과 일치 |
마무리
위 표의 패턴들은 파이썬 re 모듈의 re.match(), re.search(), re.findall() 등과 함께 사용하면 실전에서 바로 활용할 수 있습니다. 처음에는 문자 클래스와 반복 수량자부터 익히고, 점차 그룹화·역참조·앵커로 확장해 나가면 정규식을 체계적으로 마스터할 수 있습니다.