정규표현식
1. 파이썬에서의 정규 표현식 사용
정규 표현식(Regular Expressions)은 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용되는 문자열 패턴입니다. 대부분의 프로그래밍 언어에서 문법으로 지원하며 파이썬에서는 re
모듈을 통해 정규 표현식을 지원합니다.
2. 정규표현식 sample text
google에서 정규표현식 연습사이트 검색하면 2가지 사이트를 추천받을 수 있습니다. regex101.com과 regexr.com 입니다. 이 중 regexr.com에서 실습을 하도록 하겠습니다.
미리 실습환경을 조성해 두었습니다. 해당 셈플은 아래 사이트에서 확인 가능합니다.
RegExr: Learn, Build, & Test RegExhello world
hello world
hello, world
Hello World
hello world hello
hello
hallo
hollo
heallo
yellow
Monday Tuesday Wednesday Thursday Friday Saturday Sunday
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567891011121314151617181920
aaabbcaaabbcabcabc
aaa bb c aaa bb c a b c a b c
aaa1bb2c3aaa4bb5c6
[123456]
123[456]789
abc[def]ghij
010-9091-5491
010-5043-2901
010-5050-40409
010-49492-3131
010 2913 3132
01019133829
064-721-3213
010.1913.3829
paul-korea@naver.com
paul@naver.com
leehojun@gmail.com
hojun.lee@gmail.com
test.test@go.go.go
https://github.com/LiveCoronaDetector/livecod
github.com/LiveCoronaDetector/livecod
https://github.com/LiveCoronaDetector
I never dreamed about success, I worked for it.
Do not be afraid to give up the good to go for the great.
hello (hello world) hello
hello \\hello world// hello
^^
:)
[(name, leehojun), (age, 10), (height, 180), (email, paul-lab@naver.com)]
{name : leehojun, age : 10, height : 180, email : paul-lab@naver.com}
가나다라마바사아자차카타파하
ㄱㄴㄷㄹㅁㅂㅅㅇㅈㅊㅋㅌㅍㅎ
안녕_하세요
안녕-하세요
수사
수박
수상
동해 물과 백두산이 마르고 닳도록 하느님이 보호하사 우리나라 만세
hello world
hello world
hello, world
Hello World
hello world hello
hello
hallo
hollo
heallo
yellow
Monday Tuesday Wednesday Thursday Friday Saturday Sunday
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567891011121314151617181920
aaabbcaaabbcabcabc
aaa bb c aaa bb c a b c a b c
aaa1bb2c3aaa4bb5c6
[123456]
123[456]789
abc[def]ghij
010-9091-5491
010-5043-2901
010-5050-40409
010-49492-3131
010 2913 3132
01019133829
064-721-3213
010.1913.3829
paul-korea@naver.com
paul@naver.com
leehojun@gmail.com
hojun.lee@gmail.com
test.test@go.go.go
https://github.com/LiveCoronaDetector/livecod
github.com/LiveCoronaDetector/livecod
https://github.com/LiveCoronaDetector
I never dreamed about success, I worked for it.
Do not be afraid to give up the good to go for the great.
hello (hello world) hello
hello \\hello world// hello
^^
:)
[(name, leehojun), (age, 10), (height, 180), (email, paul-lab@naver.com)]
{name : leehojun, age : 10, height : 180, email : paul-lab@naver.com}
가나다라마바사아자차카타파하
ㄱㄴㄷㄹㅁㅂㅅㅇㅈㅊㅋㅌㅍㅎ
안녕_하세요
안녕-하세요
수사
수박
수상
동해 물과 백두산이 마르고 닳도록 하느님이 보호하사 우리나라 만세
3. 환경설정 및 팁
정규표현식을 입력하는 공간입니다. 뒤에 gm
이라 붙어있는 것은 flag
입니다. flag
설정은 오른쪽 상단에서 할 수 있습니다. g
는 global
로 모든 문자열에서, m
은 multiline
으로 여러 라인에서 패턴을 찾겠다는 옵션입니다. 언어가 JavaScript로 되어 있지만 학습에는 지장이 없으므로 그대로 두시면 됩니다.
테스트 문자열이 있는 공간입니다. 회원가입을 하시면 여러분만에 별도 테스트 문자열을 만드실 수 있습니다.
메뉴에서는 Cheatsheet등 다양한 팁을 확인 할 수 있습니다.
어떤 패턴에 매칭이 되는지 상세 설명을 하고 있는 공간입니다.
4. 일반 문자열
아래와 같이 입력해주세요. 정규표현식에서는 대소문자 구분을 하지만 gim
flag를 주면 대소문자 구분을 하지 않습니다. 다만 실무에서는 구분을 하는 형태로 더 많이 사용합니다.
/hello/gm
/hello world/gm
/Hello/gm
/Hello/gim
/hello/gm
/hello world/gm
/Hello/gm
/Hello/gim
5. 처음과 끝
문자열의 처음에 나오는 hello, 끝에 나오는 hello를 찾습니다. 해당 문자열을 여러 라인에서 잡기 위해서는 multiline 옵션을 주셔야 합니다. 시작은 캐럿(^
), 끝은 달러($
)로 표현합니다.
/^hello/gm : 처음에 hello
/hello$/gm : 끝에 hello
/^hello/gm : 처음에 hello
/hello$/gm : 끝에 hello
6. 모든 문자
.
(dot)은 모든 문자가 매칭됩니다. hello
, hallo
, hollo
를 모두 매칭하고 싶다면 h.llo
라고 쓸 수 있습니다.
/./gm : 모든 문자열(*과 같은 역할)
/....../gm : 모든 6개의 문자열
/h.llo/gm : h와 llo는 고정이고 .으로 되어 있는 부분만 모든 문자열
/./gm : 모든 문자열(*과 같은 역할)
/....../gm : 모든 6개의 문자열
/h.llo/gm : h와 llo는 고정이고 .으로 되어 있는 부분만 모든 문자열
만약 .
자체의 문자를 사용하고 싶다면 이스캐이프 문자를 사용해야 합니다. 이스캐이프 문자는 엔터 위에 있어요. \
역슬러쉬라고도 부릅니다.
7. 택1
대괄호를 사용하면 대괄호 안에 있는 텍스트 중 택 1합니다. 아래의 경우 hello, hallo, hyllo를 모두 매칭합니다.
/h[eay]llo/gm : 대괄호 안에 문자는 문자 1개에 해당!
/h[ea]l../gm : 총 5개의 문자
/h[eay]llo/gm : 대괄호 안에 문자는 문자 1개에 해당!
/h[ea]l../gm : 총 5개의 문자
8. 범위
범위를 지정하여 매칭하고 싶을 때에는 -
(대쉬)를 사용합니다. 대괄호 안에 대쉬와 대괄호 밖에 대쉬는 다르니 구분을 해주세요.
/h[a-f]llo/gm
/[a-zA-Z0-9]/gm : 모든 알파뱃과 숫자를 찾음
/[^a-zA-Z0-9]/gm : 나머지 문자열을 찾음
/h[a-f]llo/gm
/[a-zA-Z0-9]/gm : 모든 알파뱃과 숫자를 찾음
/[^a-zA-Z0-9]/gm : 나머지 문자열을 찾음
9. 부정
해당 문자열을 제외하고 찾고 싶을 때에는 부정을(^
) 사용합니다.
/h[^ae]llo/gm : 대괄호 안에 있다면 not에 의미
/h[^ae]llo/gm : 대괄호 안에 있다면 not에 의미
10. 서브패턴
서브 패턴은 그룹으로 묶을 수 있습니다. 특히 실무에서 많이 사용됩니다.
/(on|ues)|(rida)/gm : 그룹1(on|ues)과 그룹2(rida)로 각각 매칭되는 패턴 찾음
/(on|ues|rida)/gm : 그룹 1로 3개 중 매칭되는 패턴 찾음
/.(a|e|o)ll./gm
/(on|ues)|(rida)/gm : 그룹1(on|ues)과 그룹2(rida)로 각각 매칭되는 패턴 찾음
/(on|ues|rida)/gm : 그룹 1로 3개 중 매칭되는 패턴 찾음
/.(a|e|o)ll./gm
11. 수량자
수량자는 해당 문자가 몇 개있는지를 명시하여 패턴을 찾는 방식입니다. *
, +
, ?
, {}
를 사용합니다.
_* : 앞에 있는 문자가 0개 ~ N개
_+ : 앞에 있는 문자가 1개 ~ N개
_? : 앞에 있는 문자가 0개 ~ 1개
{3} : 3개
{3,} : 3개 이상
{1,3} : 1개 ~ 3개
_* : 앞에 있는 문자가 0개 ~ N개 ({0,})
_+ : 앞에 있는 문자가 1개 ~ N개({1,})
_? : 앞에 있는 문자가 0개 ~ 1개 ({0,1})
/[0-9]{3}[-.* ][0-9]{4}[-.* ][0-9]{4}/gm
/[0-9a-zA-Z]{2,3}[-.* ][0-9]{3,4}[-.* ][0-9]{4}/gm
/[0-9a-zA-Z]+@[0-9a-zA-Z]+.[a-zA-Z]+/gm
_* : 앞에 있는 문자가 0개 ~ N개
_+ : 앞에 있는 문자가 1개 ~ N개
_? : 앞에 있는 문자가 0개 ~ 1개
{3} : 3개
{3,} : 3개 이상
{1,3} : 1개 ~ 3개
_* : 앞에 있는 문자가 0개 ~ N개 ({0,})
_+ : 앞에 있는 문자가 1개 ~ N개({1,})
_? : 앞에 있는 문자가 0개 ~ 1개 ({0,1})
/[0-9]{3}[-.* ][0-9]{4}[-.* ][0-9]{4}/gm
/[0-9a-zA-Z]{2,3}[-.* ][0-9]{3,4}[-.* ][0-9]{4}/gm
/[0-9a-zA-Z]+@[0-9a-zA-Z]+.[a-zA-Z]+/gm
12. 캐릭터 클래스
모든 문자나 숫자 등 자주 사용되는 문자 패턴을 캐릭터 클래스로 제공합니다.
/\w/gm : 워드
/\w{5} /gm : 5개의 글자와 스페이스 하나
/\W/gm : not 워드
/\d/gm : 숫자
/\D/gm : not 숫자
/\s/gm : 스페이스
/\S/gm : not 스페이스
/\w/gm : 워드
/\w{5} /gm : 5개의 글자와 스페이스 하나
/\W/gm : not 워드
/\d/gm : 숫자
/\D/gm : not 숫자
/\s/gm : 스페이스
/\S/gm : not 스페이스
13. 이스케이프 문자
백슬러쉬를 사용하여 이미 사용되고 있는 특수 문자를 표현할 때 사용합니다.
대괄호 소괄호를 인식하기 위해 대괄호 닫기는 이스케이프 문자를 안넣어도 애러가 안나는데 소괄호 닫기에는 이스케이프 문자를 꼭 써야 합니다. (해당 챕터 맨 마지막에 테스트한 코드를 넣어두었습니다.)
/\[.*]/gm : 대괄호([]) 안에 감싸여진 문자열
/\(.*\)/gm : 소괄호 안에 감싸여진 문자열
/\\.*\//gm : 이미 사용되고 있는 특수문자로 감싸여진 문자열
/-.*-/gm : 이스케이프 문자를 사용할 필요가 없는 경우
/\^\^/gm : 이스케이프 문자가 필요한 경우
/:\)/gm : 이스케이프 문자가 필요한 경우
/\[.*]/gm : 대괄호([]) 안에 감싸여진 문자열
/\(.*\)/gm : 소괄호 안에 감싸여진 문자열
/\\.*\//gm : 이미 사용되고 있는 특수문자로 감싸여진 문자열
/-.*-/gm : 이스케이프 문자를 사용할 필요가 없는 경우
/\^\^/gm : 이스케이프 문자가 필요한 경우
/:\)/gm : 이스케이프 문자가 필요한 경우
14. 파이썬에서 정규 표현식 사용하기
정규 표현식은 파이썬에서도 로그 파일 분석, 사용자 입력 검증, 데이터 정제 등 다양한 분야에서 유용하게 사용됩니다. 복잡하고 다양한 문자열 패턴을 간결하고 효율적으로 처리할 수 있습니다.
14.1 패턴 컴파일
정규 표현식을 사용하기 전에, re.compile()
함수를 사용해 정규 표현식 패턴을 컴파일할 수 있습니다.
import re
pattern = re.compile(r'\\bfoo\\b')
import re
pattern = re.compile(r'\\bfoo\\b')
14.2 패턴 매칭
match()
: 문자열의 시작부터 패턴과 일치하는지 검사합니다.search()
: 문자열 전체에서 패턴과 일치하는 부분을 검색합니다.findall()
: 패턴과 일치하는 모든 부분을 찾아 리스트로 반환합니다.finditer()
: 패턴과 일치하는 모든 부분을 이터레이터로 반환합니다.
14.3 치환과 분할
sub()
: 패턴과 일치하는 부분을 다른 문자열로 치환합니다.split()
: 패턴을 구분자로 사용해 문자열을 분할합니다.
replaced_text = pattern.sub('bar', text)
split_text = pattern.split(text)
replaced_text = pattern.sub('bar', text)
split_text = pattern.split(text)
14.4 직접 사용하기
패턴.메서드
가 아니라 re.메서드
와 같이 사용할 수도 있습니다.
위와 같은 방식으로 sub
, findall
, match
등에 메서드를 활용할 수 있습니다.