Python re

LshDevLog·2026년 4월 19일

python

목록 보기
12/16
post-thumbnail
  • re은 정규표현식(Regular Expression)을 다루는 라이브러리
  • 문자열 패턴을 정의해서 검색/추출/치환함
  • 용도
    • 입력 검증
    • 로그 분석
    • 데이터 파싱

Match 객체

import re

match = re.search(r"\d+", "abc123")

print(match)
print(match.group())
print(match.start())
print(match.end())
print(match.span())
<re.Match object; span=(3, 6), match='123'>
123
3
6
(3, 6)
  • Match
    • 정규표현식이 문자열과 매칭되었을 때 반환되는 결과 객체
    • 다음 함수에서 반환
      • re.match
      • re.fullmatch
      • re.search
      • re.finditer (iterator안에 여러 Match가 포함)
    • Match 객체에 포함된 정보
      • 매칭된 문자열
      • start/end/span: 시작 위치/끝 위치/시작 위치 ~ 끝 위치
      • group: 매칭된 문자열 또는 캡처 그룹 결과 반환
      • 원본 문자열
      • 사용한 패턴

group, groups

import re

text = "123-456"

result = re.search(r"(\d{3})-(\d{3})", text)
print(result.group())
print(result.group(1))
print(result.group(2))
print(result.groups())
123-456
123
456
('123', '456')
  • group
    • ()괄호로 감싸면 그룹이 됨
    • 용도
      • 패턴 일부를 묶기
      • 매칭 결과 따로 추출
      • 반복 적용
      • OR 범위 지정

or group

import re

text = "dog"

result = re.search(r"(cat|dog)", text)
print(result.group())
dog
  • (a|b)

캡처하지 않은 group

import re

text = "abc123"

result = re.search(r"(?:abc)(\d+)", text)
print(result.group(1))
123
  • (?:...): 그룹은 만들지만 group()번호에는 포함X

이름있는 group

import re

text = "2026-01"

result = re.search(r"(?P<year>\d{4})-(?P<month>\d{2})", text)
print(result.group("year"))
print(result.group("month"))
print(result.groupdict())
2026
01
{'year': '2026', 'month': '01'}
  • (?P...)


raw string

import re

text = "12ab"

no_raw_string = re.match('\\d+', text)
raw_string = re.match(r"\d+", text)

print(no_raw_string.group())
print(raw_string.group())
12
12
  • r
    • 정규표현식과 Windows 경로를 편하게 쓰기 위한 문법
    • 백슬래시를 이스케이프 문자로 해석하지 않고 문자 그대로 처리
    • r을 사용하지 않으면 백슬래시가 포함된 패턴은 \\ 처럼 두 번 써야 할 수 있음

함수

match

import re

result = re.match(r"abc", "abcdef")
print(type(result))
print(result.group())
<class 're.Match'>
abc
  • match
    • 문자열 처음(0번 인덱스)부터 매칭 시도
    • 맞다면 Match객체를 리턴
    • 없으면 None 리턴

fullmatch

import re

result = re.fullmatch(r"abcd", "abcd")
print(result.group())
abcd
  • fullmatch
    • 전체 문자열이 완전히 일치해야 함

import re

result = re.search(r"abc", "123abcdef")
print(type(result))
print(result.group())
<class 're.Match'>
abc
  • search
    • 문자열 전체를 스캔하면서 처음 발견되는 첫 매칭 리턴
    • Match객체를 리턴
    • 없으면 None 리턴

finditer

import re

result = re.finditer(r"\d", "a1b2c3")

for match in result:
    print(type(match))
    print(match.group())
<class 're.Match'>
1
<class 're.Match'>
2
<class 're.Match'>
3
  • finditer
    • 해당되는 요소들을 iterator로 리턴
    • 대용량 데이터에 유리

findall

import re

result = re.findall(r"\d", "a1b2c3")
print(type(result))
print(result)
<class 'list'>
['1', '2', '3']
  • findall
    • 모든 매칭 결과를 list로 리턴

sub

import re

result = re.sub(r"\d", "*", "a1b2c3")
print(result)
a*b*c*
  • sub
    • 치환
    • str 리턴

compile

import re

pattern = re.compile(r"\d+")

result = pattern.search("abc123")
print(result.group())
123
  • compile
    • 정규표현식 패턴을 미리 컴파일해서 재사용 가능한 Pattern 객체로 만듦
    • 반복 사용 시 가독성과 재사용성이 좋음

Flags 옵션

  • Flags
    • 정규식 옵션
    • 자주 쓰는 플래그
      • re.I: 대소문자 무시
      • re.M: 여러 줄 모드
      • re.S: .이 줄바꿈 포함
      • re.X: 보기 좋게 여러 줄 작성 가능
    • |로 여러 플래그 같이 사용 가능

import re

result = re.findall(r"abc", "ABC abc", re.I)
print(result)
['ABC', 'abc']
  • re.I(IGNORECASE): 대소문자 무시

import re

text = "apple\nbanana"

result_M = re.findall(r"^\w+", text, re.M)
result = re.findall(r"^\w+", text)
print(f'result_M: {result_M}')
print(f'result: {result}')
result_M: ['apple', 'banana']
result: ['apple']
  • re.M(MULTILINE): ^, $가 각 줄을 기준으로 동작

import re

text = "a\nb"

print(re.findall(r"a.b", text))
print(re.findall(r"a.b", text, re.S))
[]
['a\nb']
  • re.S(DOTALL): . 줄바꿈 포함

import re

pattern = re.compile(r"""
\d{4}
-
\d{2}
-
\d{2}
""", re.X)

print(bool(pattern.fullmatch("2026-01-23")))
True
  • re.X(VERBOSE): 보기 좋게 여러 줄 작성 가능


패턴 문법

문자 관련

  • .: \n 제외 아무 문자
  • \d: 숫자
  • \D: 숫자 제외
  • \w: 문자 + 숫자 + _
  • \W: \w 제외
  • \s: 공백(space, tab, newline)
  • \S: 공백 제외

반복

  • *: 0개 이상
  • +: 1개 이상
  • ?: 0 또는 1
  • {n}: 정확히 n개
  • {n,}: n개 이상
  • {n,m}: n~m개

위치

  • ^: 시작
  • $: 끝


예제

이메일 검사

import re

email = "test@gmail.com"

result = re.fullmatch(r"\w+@\w+\.\w+", email)
print(bool(result))
  • 문자 .자체를 의미하려면 \. 입력

전화번호 검사

import re

phone = "010-1234-5678"

result = re.fullmatch(r"010-\d{4}-\d{4}", phone)
print(bool(result))

확장자명 검사

import re

text = "main.py"

result = re.search(r"\.py$", text)
print(bool(result))

0개의 댓글