본문 바로가기

미래 먹거리를 위하여

[파이썬 정복하기] 점프 투 파이썬 8장 – 정규표현식 (책 없이 시작하기)

8. 정규표현식(Regular Expressions)

8-1. 정규 표현식 살펴보기

정규 표현식은 문자열 안에서 특정한 규칙을 가진 부분을 찾거나 가공하기 위한 도구이며,
복잡한 조건을 간단하게 표현할 수 있는 강력한 기능.

8-2~3. 정규 표현식 시작하기

1. 주요 메타문자 정리표

메타문자 의미 예시 설명 비고
[] 문자 집합
(문자 클래스)
[abc] a, b, c 중에서 하나
  • "a" → 매치됨 (문자 "a"가 [abc] 안에 포함되어 있음)
  • "before" → 매치됨 (문자 "b"가 [abc] 안에 포함되어 있음)
  • "dude" → 매치되지 않음 (d, u, d, e 모두 [abc] 안에 없음)
[-] 범위 지정 [a-c] a부터 c까지
  • [a-zA-Z] : 모든 알파벳 (소문자와 대문자 모두)
  • [0-9] : 모든 숫자 (0부터 9까지)
  • [가-힣] : 모든 한글 (가부터 힣까지)
[^] 부정 (not) [^0-9] 숫자가 아닌 모든 문자
  • [^abc] → a, b, c가 아닌 모든 문자
  • [^A-Z] → 대문자가 아닌 모든 문자
.(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회독 끝.

 

아직도 뭐가 뭔지 모르겠다.

몇 번 더 보고, 예제를 풀어봐야 하는데 의욕이 없다.

 

왜냐하면,

대표가 교육 가지 말라고 해서 공부할 맛이 안 난다.

아직도 개발자만 대우받는 회사. 그러니까 발전이 없지.

 

맨날 자기 개발하라면서,

기회를 잡아 왔더니 날개를 꺾어 버리네.

 

똥이나 먹어라.