본문 바로가기
data science/python

정규표현(regular expressions)

by 꼰대코더 2025. 2. 7.

정의

복잡한 문자열을 처리할 때 사용하는 기법

 

임포트

import re

(대표적) 치환 메서드

② 를 사용하자

① result = re.sub(r정규표현, 치환문자(열), 대상문자열)
② regex = re.complie(r정규표현, re.MULTILINE )  ※ 대상문자열이 개행을 포함하고 있다면 re.MULTILINE으로 행을 구분
     result = regex.sub(치환문자(열), 대상문자열 )

 r " "   은 raw 를 의미하며 " " 안의 특수기호(개행문자등)를 문자로써 표현

[ ] 안에 있는 문자 개별로 존재하면 치환, 삭제

regex = re.compile(r'[346]')
str1 = regex.sub('x', '03-5454-68284') 
-> '0x-5x5x-x828x'
  참조 별도 표기  
 [0-9]   \d 0~9 중 하나라도
 [^0~9] ^ 은 NOT \D 비(非)숫자중 하나라도
 [a-zA-Z]     알파벳중 하나라도
 [ \t\n\r\f\v]   \s 화이트스페이스 
 [^ \t\n\r\f\v] ^ 은 NOT \S 화이트스페이스가 아니라면
 [a-zA-Z0-9_]   \w 문자 숫자중 하나라도
 [^a-zA-Z0-9_] ^ 은 NOT \W  비(非)문자 숫자중 하나라도
 [문자]     문자만

기타

.(dot) "a.b" "a"+모든문자+"b" \n 을 제외한 모든 문자가 1개면 OK
[.] "a[.]b "a"+".(dot)" + "b" 가운데 반드시 .(dot) 이 존재해야 OK
* "ca*t" ct/cat/caat/... *의 바로직전 문자가 0번 혹은 무한반복되면 OK
? "ca?t" ct/cat ?의 바로직전 문자가 0번 혹은 1번 반복되면 OK
+ "ca+t" cat/caat/caaat/... +의 바로직전 문자가 1번이상 반복되면 OK
{n} "ca{2}t" caat {}의 바로직전 문자가 반두시 n번 반복되면 OK
{m,n} "ca{2,5}t" 반복횟수의 범위 {}의 바로직전 문자가 2회 혹은 3회 혹은 4회 혹은 5회 반복되면 OK
| "abc|def" 혹은(or) "abc" 혹은 "def" 가 포함되면 OK
^ "^My" (개행)맨처음시작 "My" 로 문자열이 시작하면 OK
$ "you$ " (개행)맨마지막 "you"로 문자열이 끝나면 OK
\A "\AMy" re.MULTILINE 옵션
전체 문자열의 시작
 
\Z "\Zyou" re.MULTILINE 옵션
전체 문자열의 마지막
 
\b "\b단어\b = 스페이스 " 단어 " 가 있으면 OK
(  ) "(ABC)" 그룹 regex.group(n번째그룹) 으로 특정( ) 의 내용만 끄집어 낼 수 있다.
(?:   )
"(?:ABC)" 비그룹 regex.group(n번째그룹) 에 포함되지 않는다.
\ "\*" * 는 반복이 아닌 문자 위의 메타문자를 무효화하고 단순히 문자로 취급

 

r"(\w+)\s+(\d+[-]\d+[-]\d+)"

[문자숫자가 1개이상] [스페이스 1개이상] [숫자가 1개이상] - [숫자가 1개이상] - [숫자가 1개이상] 

Abc  3643-482-2

regex.group(2) -> 3643-482-2

 

string = "ftp://www.abc.com/over/article/image.jpg"

ftp 로 시작해서 jpg 로 끝나는지 확인

re.match(r'(ftp|http)://.*\.(jpg|png)$', string)

고정 ftp(혹은 http)://.(dot) 모든문자가 가능 | * 모든문자가 0 혹은 복수존재 가능 | 점 문자한개jpg나png로 끝나면 OK

 

string = "Your number is <b>123</b>

123 숫자만 추출

number = re.search(r"\d+", string)      아무숫자(\d)가 1번이상 반복

number.group() -> '123'

 

전화번호 패턴 매치

(404) 666-1111       True
(404) 6661111        True
404-666-1111        True
404-6661111        True
404666-1111        True
4046661111        True
  (404)   666-1111         True
(404)666-1111        True  
  404-666-1111        True
  404-6661111        True
 4046661111        True

result = re.match('^\s*(?:\(\d{3}\)\s* | \d{3})-?\d{3}-?\d{4}\s*$', telnumbes)

^\s*  스페이스로 시작할 수도 없을 수도 있고 스페이스는 있어도 되고 없어도 되고

(?:        ) 그룹핑하지 않고 묶음으로  처리

\(\d{3}\) () 은 그룹핑이 아닌 문자이고 (3자리 숫자가 필수)

\s* 스페이스는 있어도 되고 없어도 되고

 |  혹은

\d{3} 숫자3개

-? 하이픈은 없어도 되고 1번 있어도 되고

\d{3} 숫자3개

-? 하이픈은 없어도 되고 1번 있어도 되고

\d{4} 숫자4개

\s* 스페이스는 있어도 되고 없어도 되고

$  스페이스로 끝나거나 숫자4개로 끝나거나