정규식

지두의 개발자 도전기·2025년 3월 12일

Python

목록 보기
10/10
post-thumbnail

1. re 모듈이 필요한 이유

1-1. 문자열 다루기에서 정규표현식이 중요한 이유

  • 일반적인 문자열 처리는 split(), replace() 같은 기본 함수로 해결할 수 있지만, 복잡한 패턴을 다룰 때는 코드가 길어지고 복잡해짐.
  • 정규표현식(Regex)을 사용하면 짧고 간결한 코드로 패턴을 검색하고 수정할 수 있음.

1-2. 예제 문제: 전화번호 가운데 자리 숨기기

import re

text = '''
Elice 123456-1234567 010-1234-5678
Cheshire 345678-678901 01098765432
'''

# 전화번호 패턴을 찾아 가운데 숫자를 '*'로 변경
masked_text = re.sub(r'(\d{3,4})-(\d{4})-(\d{4})', r'\1-****-\3', text)
print(masked_text)
  • re.sub(pattern, replace, text): 특정 패턴을 찾아 변경하는 함수.
  • (\d{3,4})-(\d{4})-(\d{4}) → 전화번호 패턴을 정의 (3~4자리 숫자)-(4자리 숫자)-(4자리 숫자)
  • \1, \3 → 그룹핑을 활용해 첫 번째, 세 번째 그룹은 그대로 유지하고 두 번째 그룹만 ***로 변경.

2. 메타 문자(Meta Characters)

2-1. 메타 문자의 개념

  • 특정한 의미를 가지는 특수 기호로, 정규표현식을 구성하는 중요한 요소.
  • 특정 패턴을 빠르게 찾을 수 있도록 도와줌.

2-2. 주요 메타 문자

메타 문자의미예시
^문자열 시작^wwwwww로 시작하는 문자열 찾기
$문자열 끝.com$.com으로 끝나는 문자열 찾기
``OR 조건
[]문자 클래스[abc] → 'a', 'b', 'c' 중 하나와 매칭
\d숫자\d+ → 숫자 하나 이상 찾기
\D숫자가 아닌 문자\D+ → 숫자가 아닌 문자 찾기
\w알파벳, 숫자, _\w+ → 단어 찾기
\W특수문자\W+ → 특수문자 찾기
\s공백 문자\s+ → 공백 찾기
\S공백이 아닌 문자\S+ → 공백이 아닌 문자 찾기
.모든 문자a.b → a와 b 사이에 한 글자 있는 경우

2-3. 메타 문자 예제

import re

text = "apple banana orange"
pattern = r"b.n"

match = re.findall(pattern, text)
print(match)  # ['ban']
  • b.nbn 사이에 아무 문자나 하나 있는 단어 찾기

3. 수량자(Quantifiers)

3-1. 수량자의 개념

  • 특정 패턴이 반복되는 횟수를 지정하는 기호.
  • 패턴이 몇 번 나타나는지 정의할 수 있음.

3-2. 주요 수량자

수량자의미예시
*0개 이상elice* → "elic", "elice", "elicee" 가능
+1개 이상elice+ → "elice", "elicee" 가능 (하지만 "elic"는 안 됨)
?0개 또는 1개elice? → "elic", "elice" 가능
{n}정확히 n개\d{3} → 숫자 3개 연속
{n, m}n개 이상 m개 이하\w{3,5} → 3~5글자 단어 찾기
{n,}n개 이상a{4,} → a가 4개 이상

3-3. 수량자 예제

import re

text = "helloooo world!"
pattern = r"o{2,}"

match = re.findall(pattern, text)
print(match)  # ['oooo']
  • o{2,} → "o"가 2개 이상 연속된 부분 찾기

4. 그룹(Grouping) 활용

4-1. 그룹의 개념

  • ()를 사용해 하나의 패턴을 그룹으로 묶을 수 있음.
  • |(OR)와 함께 사용 가능.
  • 그룹핑을 하면 재사용이 가능함.

4-2. 그룹을 활용한 패턴 예제

import re

text = "elice alice tomato potato"
pattern = r"(e|a)lice"

match = re.findall(pattern, text)
print(match)  # ['e', 'a']
  • (e|a)liceelice, alice 둘 다 찾을 수 있음.

4-3. 그룹 재사용 예제

import re

text = "tomato potato"
pattern = r"(to)ma\\1"

match = re.findall(pattern, text)
print(match)  # ['to']
  • (to)를 그룹으로 저장하고, 뒤에서 \\1로 재사용 가능.

0개의 댓글