- 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
캡처하지 않은 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'}
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
search
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']
sub
import re
result = re.sub(r"\d", "*", "a1b2c3")
print(result)
a*b*c*
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']
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))