Python_10(파이썬 정규 표현식)
파이썬에서는 텍스트 안의 특정한 정보를 얻어내기 위하여 사용하는 함수나 표현법이 존재한다.
s = "aaaaaaabfo 010-1111-2222 wqpdofewpogjpermewopf"
# 010-1111-2222 있는지 여부
"010-1111-2222" in s
# 010-1111-2222 다른 문자열로 변환
s.replace("010-1111-2222", "전화번호")
s.replace("2222", "XXXX")
# 정확한 2222라는 숫자만 변경된다.
# -> 값이 일치하는 것만 찾아내기 때문에 뒷 자리 4개를 XXXX로 바꾸려면 다른 방법이 필요하다.
# -> 정규표현식 (뒷 자리 4개를 바꿀 수 있도록 패턴을 찾는다)
정규표현식 : 텍스트에서 특정한 형태나 규칙을 가지는 문자열을 찾기 위해 그 형태나 규칙을 정의하는 것
- 파이썬 뿐만 아니라 문자열을 다루는 모든 곳에서 사용된다.
- 정규식, Regexp라고도 한다.
기본개념
패턴 : 문장내에서 찾기위한 문구의 형태에 대한 표현식(정규 표현식이라고도 한다.)
메타문자 : 패턴을 기술하기 위해 사용되는 특별한 의미를 가지는 문자 ex) a* : a가 0회 이상 반복을 뜻함
리터럴 : 표현식이 값 자체를 의미하는 것 ex) a는 a 자체를 의미한다.
정규 표현식 메타 문자 : 패턴을 기술하기 위한 문자
문자 클래스 : []
- [ ] 사이의 문자들과 매칭
- [abc] : a, b, c 중 하나의 문자와 매치
- -를 이용해 범위 설정
- [a-z] : 알파벳 소문자중 하나의 문자와 매치
- [a-zA-Z0-9] : 알파벳 대소문자와 숫자 중 하나의 문자와 매치
- [가-힣ㄱ-ㅎㅏ-ㅣ] : 한글중 하나와 매치
- [^ 패턴] : ^으로 시작하는 경우 반대를 의미한다.
- [^abc] : a, b, c를 제외한 나머지 문자들 중 하나와 매치
- [^a-z] : 알파벳 소문자를 제외한 나머지 문자들 중 하나와 매치
미리 정의된 문자 클래스 : 자주 사용되는 문자클래스를 미리 정의된 별도 표기법으로 제공한다.
- \대문자는 \소문자의 반대(not) 개념이다.
- \d : 숫자와 매치, [0-9]와 동일
- \D : \d의 반대. 숫자가 아닌 문자와 매치. [^0-9]와 동일
- \w : 문자와 숫자, _(underscore)와 매치. [a-zA-Z가-힣0-9_]와 동일 (문자는 특수문자 제외한 일반문자-언어상관없는-들을 말한다.
- \W : \w의 반대. 문자와 숫자와 _(underscore)가 아닌 문자와 매치. [^a-zA-Z가-힣0-9_]와 동일
- \s : 공백문자와 매치. tab, 줄바꿈, 공백문자와 일치
- \S : \s와 반대. 공백을 제외한 문자열과 매치.
- \b : 단어 경계(word boundary) 표시. 보통 단어 경계로 빈문자열(공백)
- 단어경계: 공백, '.', '-', ',' 등이 있다.
- ex) \b가족\b => 우리 가족 만세(O), 우리가족만세 (X)
- \B : \b의 반대. 단어 경계로 구분된 단어가 아닌 경우
- ex) \B가족\B => 우리 가족 만세(X), 우리가족만세 (O)
글자수와 관련된 메타문자
- * : 앞의 문자(패턴)과 일치하는 문자가 0개 이상인 경우. ex) (a*b)
- + : 앞의 문자(패턴)과 일치하는 문자가 1개이상인 경우. ex) (a+b)
- ? : 앞의 문자(패턴)과 일치하는 문자가 한개 있거나 없는 경우.ex) (a?b)
- {m} : 앞의 문자(패턴)가 m개. ex) (a{3}b)
- {m,} : 앞의 문자(패턴)이 m개 이상. ex) (a{3,}b)
- ,뒤에 공백이 들어오지 않도록 한다.
- {m,n} : 앞의 문자(패턴)이 m개이상 n개 이하. ex) (a{2,5}b)
- ., *, +, ? 를 리터럴로 표현할 경우 \를 붙인다. ex) (\?*b)
문장의 시작과 끝 표현
- ^ : 문자열의 시작 ex) (^abc)
- 문자 클래스([ ])의 ^와는 의미가 다르다.
- $ : 문자열의 끝 ex) (abc$)
- ex) (^abc$) : abc 자체를 의미한다
기타
- . : 한개의 모든 문자(\n-줄바꿈 제외) ex) (a.b)
- ?: | : 둘중 하나(OR) ex) (?:010|011|016|019)
- ex) 010|016-111 : 010 또는 016-111 이 된다.
- ( ) : 패턴내 하위그룹을 만들때 사용
re 모듈 : 파이썬에서 정규 표현식을 지원하기 위한 모듈, 파이썬 기본 라이브러리
코딩패턴
- 모듈 import
- ex) import re
1. 객체지향형
- 패턴 객체를 생성후 메소드를 호출해 원하는 처리를 한다.
- ex) p = re.compile(r'\d+')
- ex) p.search('abc123def')
2. 함수형
- re 모듈의 원하는 작업을 하는 함수를 호출한다. Argument로 패턴과 처리할 값을 전달한다.
- ex) re.search(r'\d+', 'abc123def')
raw string
- 패턴문자중 \로 시작하는 것들을 사용할 경우 escape 문자와의 구분을 위해 \\ 두개씩 작성해야한다. 그래서 패턴을 지정할 때는 raw string을 사용하는 것이 편리하다.
- ex) re.compile('\b가족\b') : \b를 escape 문자 b(백스페이스)로 인식
- ex) re.compile(r'\b가족\b') : \b가 일반문자가 되어 컴파일시 정규식 메타문자로 처리된다.