8. 정규표현식(Regular Expressions)
8-1. 정규 표현식 살펴보기
정규 표현식은 문자열 안에서 특정한 규칙을 가진 부분을 찾거나 가공하기 위한 도구이며,
복잡한 조건을 간단하게 표현할 수 있는 강력한 기능.
8-2~3. 정규 표현식 시작하기
1. 주요 메타문자 정리표
| 메타문자 | 의미 | 예시 | 설명 | 비고 |
| [] | 문자 집합 (문자 클래스) |
[abc] | a, b, c 중에서 하나 |
|
| [-] | 범위 지정 | [a-c] | a부터 c까지 |
|
| [^] | 부정 (not) | [^0-9] | 숫자가 아닌 모든 문자 |
|
| .(dot) | 임의의 한 문자 | a.c | abc, acc 가능, ac 불가 | "a + 모든_문자 + c" |
| * | 0회 이상 반복 | ca*t | ct, cat, caaaat 가능 | * 바로 앞에 있는 문자 a가 0부터 무한대까지 반복될 수 있다는 의미 |
| + | 1회 이상 반복 | ca+t | cat, caaaat OK, ct는 NO |
"c + a가_1번_이상_반복 + t" |
| {n} | n번 반복 | a{3} | aaa | {1,}은 +, {0,}은 *와 동일하다. / "a를_반드시_3번_반복" |
| {n,m} | n~m번 반복 | a{2,4} | aa, aaa, aaaa | "a를_2~4번_반복" |
| ? | 0 or 1회 등장 | ca?t | ct, cat OK, caaat는 NO |
"c + a가_있어도_되고_없어도_됨 + t" |
| ^ | 문자열 시작 | ^hi | hi로 문자 시작 | 'hi there'는 OK, 'say hi'는 ❌ re.match("^Hello", "Hello world!") → 매칭됨 |
| $ | 문자열 끝 | bye$ | bye로 문자 끝 | 'goodbye'는 OK, 'byebye'는 ❌ |
| ` | ` | OR (또는) |
`a | |
| \d | 숫자 [0-9] | \d+ | '123' | 숫자 하나 이상 |
| \D | 숫자 아닌 문자 | \D+ | 'abc' | |
| \s | 공백 문자 | 공백, 탭, 줄바꿈 등 | ||
| \S | 공백 아닌 문자 | |||
| \w | 단어 문자 [a-zA-Z0-9_] |
\w+ | 'word123' | |
| \W | 단어 문자가 아닌 것 |
기호, 공백 등 | ||
| \b | 단어 경계 | \bword\b | 정확히 "word"와 일치 | |
| \B | 단어 아닌 경계 | \Bword\B | 접미사/접두사 등 포함된 경우 | |
| () | 그룹핑 | (\w+)\s+\1 | "is is" | import re p = re.compile(r"(\b\w+)\s+\1") m = p.search("Paris in the the spring") print(m.group()) # 👉 the the |
| \1, \2 | 그룹 참조 (backreference) |
(\d+)-\1 | "1234-1234" | 같은 단어 반복 매칭 |
| (?: ) | 그룹 비참조 | (?:ab)+ | "abab" | 참조는 안 함 |
※ 메타문자를 문자 그대로 쓰고 싶을 땐 \를 앞에 붙여야 한다.
2. re 모듈 기본 사용법
| 함수 | 설명 | 예시 | 결과 |
| re.match() | 문자열 처음부터 정규식과 일치하는지 검사 |
① import re p = re.compile('[a-z]+') m = p.match("python") print(m) ② import re p = re.compile('[a-z]+') m = p.match("3 python") print(m) |
① <re.Match object; span=(0, 6), match='python'> ② None # 문자 3이 정규식 [a-z]+에 부합되지 않으므로 None이 반환됨. |
| re.search() | 문자열 전체에서 정규식과 일치하는 부분 찾기 |
① import re m = p.search("python") print(m) ② import re m = p.search("3 python") print(m) |
① <re.Match object; span=(0, 6), match='python'> ② <re.Match object; span=(2, 8), match='python'> # 문자열 전체를 검색하기 때문에 "3" 이후의 "python" 문자열과 매치된다. |
| re.findall() | 정규식에 일치하는 모든 부분을 리스트로 반환 = 패턴([a-z]+)과 매치되는 모든 값을 찾아 리스트로 반환 |
① import re result = p.findall("life is too short") print(result) |
① ['life', 'is', 'too', 'short'] |
| re.finditer() | 반복자(iterator) 매칭된 Match 객체들을 순서대로 반환 |
import re text = "python = 3, java = 8, c = 11" pattern = re.compile(r"\w+\s*=\s*\d+") for match in re.finditer(pattern, text): print(match) print(match.group()) |
<re.Match object; span=(0, 10), match='python = 3'> python = 3 <re.Match object; span=(12, 20), match='java = 8'> java = 8 <re.Match object; span=(22, 28), match='c = 11'> c = 11 |
| re.sub() | 일치하는 부분을 다른 문자열로 치환 |
① re.sub("a", "b", "apple") ② re.sub(r"(\w+)\s+(\w+)", r"\2 \1", "hello world") |
① "bpple" ② "world hello" |
| re.compile() | 정규식 패턴을 객체로 저장하여 재사용 가능 |
① p = re.compile(r"\d+") ② re.compile(r".+", re.DOTALL) |
① p.findall("123 abc 456") → ['123', '456'] ② .이 줄바꿈까지 포함 |
3. Match 객체란?
match()나 search() 함수는 Match 객체를 반환함.
| 메서드 | 설명 | 예시 | 결과 |
| .group() | 일치하는 문자열을 반환 | m = p.match("python") m.group() |
'python' |
| .start() | 문자열 시작 인덱스를 반환 | m = p.match("python") m.start() |
0 (항상 0일수밖에 없다.) |
| .end() | 문자열 끝 인덱스를 반환 | m = p.match("python") m.end() |
6 |
| .span() | (시작, 끝) 튜플을 반환 | m = p.match("python") m.span() |
(0, 6) |
※ search 의 경우
| 메서드 | 설명 | 예시 | 결과 |
| .group() | 일치하는 문자열을 반환 | m = p.search("3 python") m.group() |
'python' |
| .start() | 문자열 시작 인덱스를 반환 | m = p.search("3 python") m.start() |
2 |
| .end() | 문자열 끝 인덱스를 반환 | m = p.search("3 python") m.end() |
8 |
| .span() | (시작, 끝) 튜플을 반환 | m = p.search("3 python") m.span() |
(2, 8) |
4. re 모듈 컴파일 옵션 정리표
컴파일 옵션은 정규표현식을 더 강력하고 유연하게 만들기 위한 설정이며,
복잡한 패턴도 쉽고 명확하게 제어할 수 있게 도와준다.
| 옵션 | 축약 | 의미 | 예시 | 설명 |
| re.IGNORECASE | re.I | 대소문자 무시 | re.search(r"hello", "HELLO", re.I) | hello, Hello, HELLO 모두 매칭 |
| re.MULTILINE | re.M | 여러 줄 처리 | re.findall(r"^abc", text, re.M) | ^, $가 각 줄의 시작/끝으로 인식 |
| re.DOTALL | re.S | .이 줄바꿈(\n)까지 포함 | re.search(r"a.b", "a\nb", re.S) | 줄바꿈을 포함한 매칭 가능 |
| re.VERBOSE | re.X | 정규식 가독성 향상 | 여러 줄 정규식 정의 | 공백/주석 허용, 복잡한 패턴 설명 가능 |
| re.ASCII | re.A | ASCII 모드 | \w, \d 등은 ASCII 문자만 포함 | 유니코드 문자 제외 (영문자만 허용) |
8-3. 강력한 정규 표현식의 세계로
전방 탐색 & 후방 탐색 요약표
주제 문법 설명 예시 결과
| 주제 | 문법 | 설명 | 예시 | 결과 |
| 긍정 전방 탐색 | A(?=B) | A 뒤에 B가 있는 경우만 A 매칭 | \d+(?=원) | "100원" → 100 |
| 부정 전방 탐색 | A(?!B) | A 뒤에 B가 없는 경우만 A 매칭 | \d+(?!원) | "100달러" → 100 |
| 긍정 후방 탐색 | (?<=B)A | B 뒤에 오는 A만 매칭 | (?<=\$)\d+ | "$120" → 120 |
| 부정 후방 탐색 | (?<!B)A | B가 앞에 없는 A만 매칭 | (?<!\$)\d+ | "120원" → 120 |
해설 요약
| 용어 | 의미 |
| Lookahead | 현재 위치에서 앞을 살펴보고 조건이 맞으면 매칭 |
| Lookbehind | 현재 위치에서 뒤를 살펴보고 조건이 맞으면 매칭 |
| "탐색" | 실제 매칭 결과에 포함되지 않음 (조건 역할만 함) |
실질적인 책 읽기는 다 끝났다. 즉, 1회독 끝.
아직도 뭐가 뭔지 모르겠다.
몇 번 더 보고, 예제를 풀어봐야 하는데 의욕이 없다.
왜냐하면,
대표가 교육 가지 말라고 해서 공부할 맛이 안 난다.
아직도 개발자만 대우받는 회사. 그러니까 발전이 없지.
맨날 자기 개발하라면서,
기회를 잡아 왔더니 날개를 꺾어 버리네.
똥이나 먹어라.
'미래 먹거리를 위하여' 카테고리의 다른 글
| [파이썬 정복하기] 라이브러리 2장 - 바이너리 데이터 다루기(맥OS 기준) (1) | 2025.11.02 |
|---|---|
| [파이썬 정복하기] 라이브러리 1장 - 텍스트 다루기(맥OS 기준) (0) | 2025.11.01 |
| [파이썬 정복하기] 점프 투 파이썬 7장 – 파이썬 날아오르기 (책 없이 시작하기) (0) | 2025.10.30 |
| [파이썬 정복하기] 점프 투 파이썬 6장 – 파이썬 프로그래밍, 어떻게 시작해야 할까? (책 없이 시작하기) (1) | 2025.10.29 |
| [파이썬 정복하기] 점프 투 파이썬 5장 – 파이썬 날개 달기 ② (책 없이 시작하기) (0) | 2025.10.23 |