정규표현식

박은정·2021년 7월 26일
0

TIL

목록 보기
4/72

flag : 파이썬의 옵션

compile을 통해서 패턴과 flag 등록할 수 있다

compile 종류단축설명
re.compile('패턴', re.DOTALL)re.comdile('패턴', re.S)모든문자 (줄바꿈포함)매칭한다
re.compile('패턴', re.IGNODRECASE)re.comdile('패턴', re.I)대소문자 구분 안함
re.compile('패턴', re.MULTILINE)re.comdile('패턴', re.M)모든 라인에서 매칭한다
re.compile('패턴', re.VERBOSE)re.comdile('패턴', re.X)주석 등의 편의기능 사용가능하다
re.compile('패턴', re.ASCII)re.comdile('패턴', re.A)ASCII코드만을 사용한다

flag 옵션 사용방법

  1. re.compile('패턴').match(문자열)
  2. re.compile(패턴, 문자열, flags=0)

2번의 경우를 더 많이 사용한다

g

global로 모든 문자열에서 찾겠다
global 옵션을 지워주면 맨 처음에 나오는 문자열에서만 찾는다

case insensitive

case insensitive 옵션 체크하면 대소문자 구분없음
예시: Hello, hello모두 찾음

sitcky

일회용, 최초로 발견되는 문자열만 찾는다

처음과 끝 (Anchors)

/^hello/gm

문장 앞에 나오는 hello만 찾겠다

/hello$/gm

문장 끝에 나오는 hello만 찾겠다

모든문자 매칭 (찾기)

모든 문자열은 점으로 표현됨

/./gm

모든 문자열(* 이랑 같은 역할)

/....../gm

모든 6개의 문자열 매칭한다
6자리 문자열을 매칭한다
띄어쓰기도 문자열로 인식된다

그래서 점 자체 를 찾고 싶다면 역슬래시 \를 이용해서 찾는다

선택

/h[ea]llo/gm

hello , hallo 모두 매칭됨

/h.llo/gm

hello, hallo, hollo던 모두 매칭이 되는데
이때 /h[.]llo/gm 이라고 입력하면 점이 적용되지 않는다

[.]은 문자 그대로의 점을 매칭

범위 [-]

대괄호는 주로 범위를 나타낼 때 많이 사용된다
예: /h[a-f]llo/gm

/[a-z]/gm

알파벳 소문자 매칭

/[A-Z]/gm

알파벳 대문자 매칭

/[0-9]/gm

숫자 매칭

모든 문자

/[a-zA-Z0-9]/gm

모든 알파벳, 숫자

/[^a-zA-Z0-9]/gm

나머지 문자열 (공백, 특수문자)

부정 not

[] 안에서 사용된 꺽쇠 ^ : [^]

not의 의미

/h[^ae]llo/gm

hello, hallo 말고 h.llo hollo 선택됨

[] 밖에서 사용된 ^ : ^[]

처음이라는 의미


서브패턴 (그룹으로 묶기)

/(on|ues|rida)/gm

on, ues, rida 3개 중 하나를 만족해도 매칭하게 된다

/(on|ues)|(rida)/gm

일단 결과값은 동일하지만 (사이트에서) 마우스를 오버했을 때의 설명은 다르다

매칭된 문자열그룹1그룹2
Mondayonundefined
Tuesdayuesundefined
Fridayundifinedrida

/.(a|e|o)ll./gm

패턴의 앞뒤로도 텍스트를 붙일 수 있다
hello Hello yello kello !ello 가 매칭된다

  1. . : 모든 문자열 가능

  2. (a|e|o) : 3개의 문자 중에 하나면 매칭된다

  3. ll : 일반 문자열 "ll"이 일치해야 한다

  4. . : 아무 문자 하나 매칭 (특수문자 가능)

/.(a|e)ll.() () ()/gm

여러 개의 그룹으로 나눠서 설정할 수도 있다

그루핑 규칙 3가지

1. 그룹을 설정하지 않는 방법 : /(?abc)/gm

`/(?:on|ues)|(rida)/gm `

on|ues 둘 중하나와 일치해도 매칭되긴 하지만 그룹으로 설정되지는 않는다
하지만 rida 는 그룹으로 설정된다

2. positive 매칭 :/(?=abc)/gm

abc가 들어간 것을 매칭한다

/hello (?=world)/gm 

뒤에 "world"가 들어간 "hello" 만 매칭시킨다
"world"를 매칭시키는 것이 아니다

hello world hello world hello 매칭된다
Hello world hello World 는 매칭되지 않는다

3. negative 매칭 : /(?!abc)/gm

abc가 아닌 것을 매칭한다 (not의 의미)

/hello (?!world)/gm

뒤에 "world"가 들어가지 않는 hello만 매칭시킨다
hello World 매칭된다
world가 아니라 world 이기 때문에 → hello world(띄어쓰기 두개) 매칭된다


수량자

해당 문자가 몇 개 있는지 명시하여 패턴을 찾는다

* + ? {} 사용한다

수량자 종류

1. *

앞에 있는 문자가 한개도 없어도 될때 사용

2. +

앞에 있는 문자가 한개 이상 있어야 할때 사용

3. ?

앞에 있는 문자가 없거나 있거나

4. {}

개수 지정가능
{3.} : {3,and}에서 and가 생략된거라 생각하자


수량자를 서로 호환해서 사용

1. _* &_{0,}

앞에 있는 문자_ 가 0개 ~ N개 0개이상

2. _+ & _{1,}

앞에 있는 문자_ 가 1개 ~ N개 1개이상

3. _? &_{0,1}

앞에 있는 문자_ 가 0개 ~ 1개 있거나 없거나

/.{5}/gm

공백까지 글자수로 인식되기 때문에 특정하지 못한다

/h{4}/gm

h 다음에 모든 문자가 4개만 이어지는 문자열만 특정된다 (매칭된다)


수량자 활용

1. 핸드폰번호 ver.1

/[0-9][0-9][0-9][-.* ][0-9][0-9][0-9][0-9][-.* ][0-9][0-9][0-9][0-9]/gm

결과
010-1234-1234
010 1234 1234
010*1234*1234
숫자 사이에 셋 중 하나라도 매칭된다

2. 핸드폰번호 ver.2

/[0-9]{3}[-.* ][0-9]{4}[-.* ][0-9]{4}/gm

이때 [0-9]가 반복되므로 {} 를 활용해서 간단하게 입력할 수도 있다
이렇게 정규표현식을 입력해줄 수 있다

3. 전화번호

/[0-9]{2,3}[-.* ][0-9]{3,4}[-.* ][0-9]{4}/gm

지역번호 02, 031 모두 찾을 수 있고
가운데번호가 332, 3345 모두 찾을 수 있다

4.이메일주소

/[0-9a-zA-Z]+@[0-9a-zA-Z].[a-zA-Z]/gm
  1. [0-9a-zA-Z]+ : 1개이상의 문자

    맨 앞에 아무 글자도 없을 수는 없으니까
    *(0개이상)이 아니라 +(1개이상)로

  2. @ : 무조건 포함되어야 하는 문자 @

  3. [0-9a-zA-Z]+ : 1개이상의 문자

  4. . : 문자 .

  5. [a-zA-Z]+ : 뒤에는 숫자가 나오지 않으니 (1개이상의)문자만 검색

결과 : 아래 두개의 이메일은 매칭되지 않는다
paul-korea@naver.com (-때문에)
hojun.lee@gmail.com (. 때문에)


캐릭터클래스

/\w/gm

워드

/\w{5} /gm

5개의 글자와 스페이스 하나

/\W/gm

not 워드

/\d/gm

숫자

/\D/gm

not 숫자

/\s/gm

스페이스

/\S/gm

not 스페이스

캐릭터클래스를 활용한 전화번호 정규식

  1. 기존 수량자를 이용한 전화번호 정규식
1. /[0-9]{3}-[0-9]{4}-[0-9]{4}/gm
2. /[0-9]{3}[-.* ][0-9]{4}[-.* ][0-9]{4}/gm
3. /\d+[-* .]?\d+[-* .]?\d/gm

? : 앞의 문자가 나올수도 있고 안나올수도 있고
+ : 앞의 문자가 하나 이상으로 나와야한다

  1. 캐릭터클래스를 이용한 전화번호 정규식
1. /\d{3}-\d{4}-\d{4}/gm
2. /\d{3}\W\d{4}\W\d{4}/gm

이스케이프 문자

백슬러시를 이용해서 특수문자 자체를 매칭하기

/abc\\abc/gm

abc/abc 가 매칭된다

정규식의 이스케이프 문자 활용

^^ :) (hello world)

대괄호, 소괄호 안에 감싸져있는 값들은 데이터분석에서 string값을 주는 경우가 많다
일일히 replit이나 split을 주는 것보다 정규표현식으로 쓰는 것이 더 좋다

/\[\w*\]/gm

  • \w : 워드(문자, 숫자)
  • * 몇개의 글자수인지 특정하지 않음

[123456], [456], [abc] 가 매칭된다
[de!f]는 매칭되지 못한다

/\[\ d*\]/gm

\d : 숫자만 매칭된다 (문자는 매칭되지 않는다)

[123456], [123] 매칭된다

/[.*]/ gm

  • . : 모든문자(특수문자 포함)
  • * 몇개의 글자수인지 특정하지 않음

[123456], [456], [de!f] 매칭된다

/\(.*\)/gm : 소괄호 안에 잇는 문자 매칭하기

(hello, world)
(name, leejojun), (age, 10), (height, 180), (email, paul-lab@naver.com) 매칭된다

/\\\\.*\/\//gm : 백슬래시 & 슬래시 매칭하기

\\hello world// 매칭된다

\\ : 백슬래시 두개의 정규식이 실제 문자 \ 백슬래시 하나를 매칭하기 때문에

백슬래시 두개를 매칭하고 싶은 경우 정규식에는 \\\\ 백슬래시 4개를 입력해준다

/\^\^/gm : 꺽쇠문자

특수문자 ^ : 문자열 매칭하거나 그룹의 not의 의미를 가지기 때문에
/^^/gm이라고 입력하면 ^^ 가 매칭되지 않는다

/\:\)/gm : 콜론 매칭하기

:) 매칭하기

이스케이프 문자가 필요없는 경우 : /-.*-/gm

  • - 도 특수문자이긴 하지만 대괄호 안에서만 사용되기때문에 그냥 입력해줘도 된다
  • /\-.*\-/gm 같이 역슬래시를 입력해줘도 문제는 없어서
  • 헷갈릴때에는 특수문자 앞에 역슬래시를 넣어주면 된다

-0901-, -5043-, -721-가 매칭된다


한글 정규표현식

/[ㄱ-ㅎ]/gm

자음만 있는ㄱㄴㄷㄹㅁㅂㅅㅇㅈㅊㅋㅌㅍㅎ 매칭된다

/[ㄱ-ㅎ|ㅏ-ㅣ|가-힣]/gm

모든 한글표현을 매칭한다

/[가-힣]/gm

자음 혹은 모음만이 아니라 하나의 한글글자?를 매칭한다

가나다라마바사아자차카타파하,수사 수박 수상 동해 물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라 만세 매칭된다

/^[가-힣]+$/gm

첫 문자부터 종료까지 한글만 있는 문자열을 매칭한다
가나다라마바사아자차카타파하
수사 수박 수상 매칭된다
(동해 물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라 만세는 사이에 띄어쓰기로 구분되어있어서 매칭되지 않는 듯 하다)

/^[가-힣 ]+$/gm

한글표현 다음에 띄어쓰기가 있는 문자열도 매칭한다

가나다라마바사아자차카타파하, 수사, 수박, 수상, 동해 , 물과 , 백두산이 , 마르고 , 닳도록 , 하느님이 , 보우하사 , 우리나라 , 만세 매칭된다

/^[가-힣\-_ ]+$/gm

한글표현 다음에 -, _, 가 있는 문자열 매칭한다

`/^[가-힣-_  ]+$/gm`
  • 위와같이 입력하면 오류가 발생한데 대괄호 안에서 - 는 범위를 나타내기 때문이다
  • 해결방안 :- 앞에 \를 입력해주면 된다
  • 안녕_하세요, 안녕-하세요 매칭된다

profile
새로운 것을 도전하고 노력한다

0개의 댓글