728x90
정규식
- 정규표현식은 복잡한 문자열을 처리할 때 사용하는 기법
- 파이썬만의 고유한 기법이 아니라 문자열을 처리하는 모든 곳에서 사용
규칙 찾기
data = "나의 전화번호는 010-0000-0000 입니다. 너의 전화번호는 010-1111-1111 입니다."
텍스트의 규칙을 보니 띄어쓰기 기준으로 나누고, 전화번호의 특징을 보면 하이픈이 사이에 2개가 있다.
전화번호의 특징이 첫 3자리, 두번째 4자리, 세번째 4자리 형식이다.
data = "나의 전화번호는 010-0000-0000 입니다. 너의 전화번호는 010-1111-1111 입니다."
import re
pat = re.compile("\d{3}-\d{4}-\d{4}")
phone_list = pat.findall(data)
phone_list
=> ['010-0000-0000', '010-1111-1111']
re(regular expression) 모듈
- 파이썬의 정규표현식을 지원하기 위한 모듈
- match 함수
- pattern에 맞는 문자열로 시작하는지 검사하고 매칭이 되면 match 객체를 반환하고, 그렇지 않으면 None 을 반환한다.
예시
data = "나의 전화번호는 010-0000-0000 입니다. 너의 전화번호는 010-1111-1111 입니다."
print(re.match("나의",data))
print(re.match("전화",data))
=> <re.Match object; span=(0, 2), match='나의'>
None
- search 함수
- pattern에 맞는 문자열을 검사하고 매칭되면 바로 match 객체를 반환한다.
- 매칭이 안되면 None을 반환한다.
예시
data = "나의 전화번호는 010-0000-0000 입니다. 너의 전화번호는 010-1111-1111 입니다."
re.search("전화",data)
=> <re.Match object; span=(3, 5), match='전화'>
- findall 함수
- 정규식과 매칭되는 모든 문자열을 리스트로 반환한다.
예시
data = "나의 전화번호는 010-0000-0000 입니다. 너의 전화번호는 010-1111-1111 입니다."
re.findall("번호",data)
=> ['번호', '번호']
- sub 함수
- 정규식과 매칭되는 부분을 치환해준다.
예시
re.sub("전화번호","핸드폰번호",data)
=> 나의 핸드폰번호는 010-0000-0000 입니다. 너의 핸드폰번호는 010-1111-1111 입니다.
메타문자
- 메타문자란 원래 그 문자가 가진 뜻이 아닌 특별한 용도로 사용하는 문자
- 대괄호 안에서는 메타문자열학을 안한다. ( \ 사용해야한다)
- \ ^ $ . [] () * + ? {}
- '.'
- 줄바꿈 문자(\n)를 제외한 모든 문자와 매치
예시
data = "abc a\nc a c"
re.findall("a.c",data)
=> ['abc', 'a c']
- '*'
- 바로 앞에 문자가 0번 이상 반복할 경우 매치
예시
data = "abc ac abbc a c"
re.findall("ab*c",data) # 왼쪽에는 a가 있고 b가 와야한다. 그리고 오른쪽에는 b 다음에 c가 있는 것
=> ['abc', 'ac', 'abbc']
- '+'
- 바로 앞에 문자가 1번 이상 반복할 경우 매치
예시
data = "abc ac abbbc"
re.findall("ab+c",data)
=> ['abc', 'abbbc']
반복 횟수 제한
- {m,n}: 바로 앞에 문자의 반복 횟수가 m번에서 n번 사이
- {m}: 바로 앞에 문자의 반복 횟수가 m번
- {m,}: 바로 앞에 문자의 반복 횟수가 m번 이상
- {,n}: 바로 앞에 문자의 반복 횟수가 n번 이하
예시
data = "abc ac abbbc abbbbc"
re.findall("ab{1,3}c",data)
=> ['abc', 'abbbc']
------------------------------
data = "abc ac abbbc abbbbc"
re.findall("ab{4}c",data)
=> ['abbbbc']
- '?'
- 반복은 아니지만 앞에 문자가 있거나 없거나를 의미
예시
data = "abc ac abbbc abbbbc"
re.findall("ab?c",data) # ab{0,1}
=> ['abc', 'ac']
- '[ ]'
- [ ] 사이의 문자들과 매칭이라는 의미
예시
data = "abc ac acc acb"
re.findall("a[bc]c",data) # b or c
=> ['abc', 'acc']
하이픈(-) 사용하기
- [a-zA-Z] : 모든 알파벳과 매치
- [0-9] : 모든 숫자와 매치
예시
data = "python 3.10.5"
re.findall("[0-9a-zA-Z]+",data) # 모든 문자 출력(if '.'출력하고 싶으면 '.'넣기!)
=> ['python', '3', '10', '5']
- \d : `[0-9] 과 동일
- \w : `[a-zA-Z0-9_] 과 동일
예시
data = "python 3_10_5"
re.findall("\w+",data)
=> ['python', '3_10_5']
- [^]
- not을 의미한다.
예시
data = "python 3.10.5"
re.findall("[^\d. ]+",data)
=> ['python']
- ^ : 검사하고자하는 문자열에 정규식에 맞는 문자로 시작하는지를 검사한다.
- $ : 검사하고자하는 문자열에 정규식에 맞는 문자로 끝나는지를 검사한다.
예시
phone = "p010-0000-0000qwe" # 잘못된 정보를 확인하기 위해 주로 쓰인다.
match = re.search("^\d{3}-\d{4}-\d{4}$",phone)
match
=> <re.Match object; span=(0, 13), match='010-0000-0000'>
- 프로그램 내에서 자주 사용하는 정규식 패턴에 경우 re.compile 함수를 이용해 컴파일을 미리한 후
패턴객체를 생성해서 찾자. 즉, 자주쓰는 패턴이라면 정규식을 미리 컴파일하자.
예시
pat_obj = re.compile("\d{3}-\d{4}-\d{4}")
type(pat_obj)
pat_obj.findall(data)
=> ['010-0000-0000', '010-1111-1111']
이번 정규표현식은 뭔가 완벽하게 끝내지 못한 느낌인 것 같다.
그래서 연습이 더 필요할 것 같다.
강사님이 추천해주신 사이트에서 연습해봐야겠다.
사이트 주소는 https://regex101.com/ 이다...!
728x90
'AI 공부 > 파이썬' 카테고리의 다른 글
파이썬 (pip와 가상 환경) 마지막! (0) | 2022.08.10 |
---|---|
파이썬 (파일(JSON) 입출력, 구글 드라이브 마운트, YAML, pickle 모듈) (0) | 2022.08.10 |
파이썬 (iterable & iterator와 Generator) (0) | 2022.08.09 |
파이썬 (collections, defaultdict, OrdereDdict 모듈) (0) | 2022.08.08 |
파이썬 (예외 처리) (0) | 2022.08.08 |
댓글