정규 표현식(Regular Expression)
문자열을 패턴에 따라 검색하거나 치환, 추출 등을 할 때 사용
------🐢
re 모듈
파이썬에서 정규 표현식을 사용하려면 re 모듈을 임포트해야 됨
import re
pattern = r"abc"
text = "abcdef"
match_obj = re.search(pattern, text)
if match_obj:
print("찾았다!", match_obj.group()) # 'abc'
pattern: 정규 표현식 패턴 문자열 (Raw string r"..."으로 쓰는 것을 권장)
text: 실제 검사 대상 문자열
re.search(): 텍스트 전체를 검색하여, 첫 번째로 일치하는 구간(매치)을 찾음
-----🐢-
정규 표현식 기초 문법
메타 문자(Metacharacters)
. (dot): 임의의 한 문자(개행 제외)
^: 문자열 시작 위치(또는 각 라인 시작, re.MULTILINE 옵션 시)
$: 문자열 끝 위치(또는 각 라인 끝, re.MULTILINE 옵션 시)
*: 바로 앞 패턴이 0번 이상 반복
+: 바로 앞 패턴이 1번 이상 반복
?: 바로 앞 패턴이 0번 또는 1번
{m,n}: 바로 앞 패턴이 m번 이상, n번 이하 반복
[...]: 대괄호 안에 있는 문자 중 하나와 매치(문자 클래스)
|: or (분기)
(): 그룹(Group) 을 만들거나, 캡처 그룹으로 묶음
>>> 예시
ab* → 'a' 뒤에 'b'가 0번 이상: "a", "ab", "abb", "abbbb", ...
[0-9]+ → 숫자(0~9)가 1개 이상 연속
(abc|xyz) → 'abc' 또는 'xyz'
특수 시퀀스
\d: 숫자 (digit) = [0-9]
\D: 숫자가 아닌 문자 = [^0-9]
\s: 공백 문자(스페이스, 탭 등)
\S: 공백이 아닌 문자
\w: 문자 + 숫자 + _ → [a-zA-Z0-9_]
\W: \w가 아닌 문자
\b: 단어 경계(Word boundary)
\B: 단어 경계가 아닌 곳
----🐢--
re 모듈 주요 함수
re.match(pattern, string)
문자열의 시작 부분이 패턴과 매치되는지 검사
일치하면 매치 객체(Match object) 반환, 없으면 None
m = re.match(r"\d+", "1234abcd")
if m:
print(m.group()) # '1234'
re.search(pattern, string)
문자열 전체를 검색해서 첫 번째로 매치되는 부분을 찾음
일치하면 매치 객체 반환, 없으면 None
s = re.search(r"[A-Z]+", "abcDEFghi")
if s:
print(s.group()) # 'DEF' (첫 매치)
re.findall(pattern, string)
매치되는 모든 부분을 찾아 리스트로 반환
그룹이 사용되면, 각 매치마다 그룹의 튜플을 반환할 수도 있음
results = re.findall(r"\d+", "12 cats, 3 dogs, 45 birds")
print(results) # ['12', '3', '45']
re.finditer(pattern, string)
매치되는 모든 부분에 대한 매치 객체 이터레이터를 반환
매치 객체로부터 위치(.start(), .end()) 등을 얻을 수 있음
it = re.finditer(r"[a-zA-Z]+", "Hello123 World456")
for match in it:
print(match.group(), match.start(), match.end())
# 'Hello' 0 5
# 'World' 9 14
re.sub(pattern, repl, string)
패턴에 매치되는 부분을 repl로 치환(substitute)하여 반환
예: 전화번호나 이메일을 마스킹할 때 유용
text = "My phone number is 010-1234-5678"
masked = re.sub(r"\d", "*", text)
print(masked)
# "My phone number is ***-****-****"
re.split(pattern, string)
패턴을 기준으로 문자열을 분할하여 리스트를 반환
parts = re.split(r"[,;]", "apple,banana;orange")
print(parts) # ['apple', 'banana', 'orange']
---🐢---
매치 객체(Match object)
매치에 성공하면 함수(search, match, 등)에서 Match 객체가 반환
주요 메서드/속성
.group(): 매치된 전체 문자열
.group(n): n번째 캡처 그룹에 해당하는 문자열
.start(), .end(): 매치된 문자열의 시작/끝 인덱스
.span(): (start, end) 튜플
text = "abc123xyz"
m = re.search(r"(\d+)", text)
if m:
print(m.group()) # '123'
print(m.group(1)) # '123' (1번 그룹)
print(m.start(1)) # 3
print(m.end(1)) # 6
print(m.span()) # (3, 6)
--🐢----
정규 표현식 옵션
re.IGNORECASE 또는 re.I: 대소문자 구분 없이 매치
re.MULTILINE 또는 re.M: ^, $를 각 라인의 시작, 끝으로 인식
re.DOTALL 또는 re.S: .이 개행 문자까지 포함하도록
re.VERBOSE 또는 re.X: 패턴 내에 공백, 주석을 허용해 가독성 높임
import re
pattern = r""" # 여러 줄로 정규식 작성
^[A-Za-z]+ # 맨 앞에 알파벳 1개 이상
\d*$ # 그 뒤에는 숫자 0개 이상, 그리고 끝
"""
compiled = re.compile(pattern, re.VERBOSE | re.IGNORECASE)
m = compiled.match("User1234")
if m:
print("매치됨!")
'언어 > Python' 카테고리의 다른 글
파이썬 타입 어노테이션 (0) | 2025.01.11 |
---|---|
이터레이터/제너레이터 (0) | 2025.01.10 |
클로저/데코레이터 (1) | 2025.01.09 |
유니코드 문자열 (1) | 2025.01.08 |
Threading 모듈 (0) | 2025.01.07 |