-
[python] Regular Expression(정규표현식) #Step1파이썬 2021. 10. 23. 00:16728x90
💢정규표현식Regular expression) #step1
정규표현식이란??
- 복잡한 문자열을 처리할 때 사용하는 기법으로, 파이썬만의 문법이 아니라 문자열을 처리하는 모든 곳에서 사용한다. 밑에서 정규표현식이 왜 필요한지 살펴 보도록 하자!
❓왜 정규 표현식을 사용할까?
예를 들어 주민등록번호 번호 형태(ex)111111-1111111))로 있을때 보안상 뒤에있는 7자리를 *로 처리하고 싶을 때를 생각해보자. 정규 표현식을 모를 경우 아래와 같이 구현을 해야 한다.
📜일반적 코드
data = """ park 111111-1111111 kim 222222-2222222 """ result = [] for line in data.split("\n"): word_result = [] for word in line.split(" "): if len(word) == 14 and word[:6].isdigit() and word[7:].isdigit(): word = word[:6] + "-" + "*******" word_result.append(word) result.append(" ".join(word_result)) print("\n".join(result))📄출력값
park 111111-******* kim 222222-*******정규식을 모를 경우 저렇게 긴 코드를 작성해야 하지만 알 경우 훨씬 간편하게 구현을 할 수 있다 아래와 같은 코드를 봐보도록 하자
📜정규표현식 코드
import re #정규표현식 라이브러리 호출 data = """ park 111111-******* kim 222222-******* """ pat = re.compile("(\d{6})[-]\d{7}") print(pat.sub("\g<1>-*******", data))📄출력값
park 111111-******* kim 222222-*******그럼이제 정규표현식에는 어떤 문자들을 사용해 내가 원하는 형태로 만들고 바꿀 수 있는지 알아보도록 하자
🔑자주사용되는 문자
의미 내용 . 임의의 한문자를 의미 ? 문자가 존재하거나 존재하지 않음(0,1) * 문자가 미존재 또는 무한대로 존재(0~) + 문자가 한번 이상 무조건 존재(1~*) ^ 기호 바로 뒤의 문자로 문자열이 시작 $ 기호 바로 앞의 문자로 문자열이 끝남 {m} m만큼 반복 {m, n} m~n만큼 반복 가능 \\ 역슬래쉬ㅜ 글자 자체를 검색 \d 모든 숫자를 검색, [0-9]와 동일 \D [^0-9]와 동일, 숫자를 제외한 모든 문자를 검색 \s 공백을 검색(space) \S 공백이 아닌 문자를 검색 \w 숫자 또는 문자를 검색[a-zA-Z0-9] word를 표현하며 \W 알파벳, 숫자가 아닌 문자를 의미[^a-zA-Z0-9] \b 문자와 공백 사이의 문자를 의미 \B 문자와 공백 사이가 아닌 문자를 의미 \d digit의 약자로 숫자를 의미 \D non digit를 표현하며 숫자가 아닌 것을 의미 위 테이블의 문자열들이 어떤 역할을 하는지 인지한 상태에서 코드로 어떻게 구현되는지 확인해 보도록 하자.
정규식과 문자열 매치여부 확인연습
✅Dot(.)
a.b
위 정규식 의미는 "a + 모든 문자 + b"라고 이해를 하면 된다
즉 a와 b라는 문자 사이에어떤 문자가 들어가도 모두 매치된다.정규식 문자열 Match 여부 설명 a.baab Yes a와 b 사이에 문자열이 존재 a.ba0b Yes a와 b 사이에 문자열이 존재 a.babc Yes a와 b 사이에 문자열이 존재X ※
.를 임의의 문자로 인식하는게 아니라 .그대로를 의미하고 싶을때a[.]b사용
✅반복(*)
*는 앞에 문자가 0번부터 무한대까지 반복을 의미하므로 앞에 문자가 있어도 없어도 크게 상관없다.정규식 문자열 Match 여부 설명 ca*rcr Yes "a가 0번 반복되어 매치" ca*rcar Yes a가 1번 반복되어 매치 ca*rcaaar Yes a가 3번 반복되어 매치
✅반복(+)
+는 앞에 문자가 최소 1번부터 무한대까지 반복을 의미한다.정규식 문자열 Match 여부 설명 ca*rcr No "a가 0번 반복되어 매치X" ca*rcar Yes a가 1번 반복되어 매치 ca*rcaaar Yes a가 3번 반복되어 매치
✅반복({m,n})
{}안에 숫자가 하나면 무조건 그 수만큼 반복을 해야하고 m, n으로 주어지면 그 사이 안에서 반복해야 함을 의미한다.✅m만 있을 경우
정규식 문자열 Match 여부 설명 ca{2}rcar No "a가 1번 반복되어 매치X" ca{2}rcaar Yes a가 2번 반복되어 매치 ✅m, n이 주어질 경우
정규식 문자열 Match 여부 설명 ca{2,5}rcar No "a가 1번 반복되어 매치X" ca{2,5}caar Yes a가 2번 반복되어 매치 ca{2,5}caaaaar Yes a가 5번 반복되어 매치
✅임의의 한문자(?)
?는 0혹은 1을 의미정규식 문자열 Match 여부 설명 a? a Yes "a가 1번 있으므로 매치" a? b Yes a가 0번이지만 매치
✅특정문자 범위(^)
^[]일 경우: 기호뒤에 있는 문자열로 시작해야 함을 의미[^]일 경우: 기호뒤에 있는 문자열로 시작하면 안됨을 의미정규식 문자열 Match 여부 설명 ^[A-Z]Hello Yes 대문자로 시작했으므로 매치 ^[A-Z]hEllo No 소문자로 시작했으므로 매치X [^A-Z]Hello No 소문자로 시작했으므로 매치X [^A-Z]hEllo Yes 소문자로 시작했으므로 매치
✅특점 범위로 끝나는지 여부($)
특정 문자(숫자) 범위로 끝나느지 여부 판단하기 위해 사용
1.[범위]$와2.[범위]+$식으로 사용정규식 문자열 Match 여부 설명 [0-9]+test01 Yes 숫자가 포함되어 있으므로 매치" [0-9]+t13est01 Yes 숫자가 포함되어 있으므로 매치" [0-9]+2tes05t Yes 숫자가 포함되어 있으므로 매치" [0-9]+$test01 Yes 숫자로 끝이 났으므로 매치" [0-9]+$t13est0 Yes 숫자로 끝이 났으므로 매치" [0-9]+$2test No 숫자로 끝이 나지 않았으므로 매치X" ___ ✅특수 문자 판단하기
- 정규표현식에 사용하는 특수문자(
*, +, ?, .,^, $, (,), [,], -) 등을 판단하려면 특수 문자를 판단할 때는 특수 문자 앞에/ 표현
📜코드
# * : 0~ 무한대의 반복 횟수 # \* : * 표현의 데이터를 의미 # * 표현이 한번 이상 무한대 포함 되어야만 유효한 문자열로 검증 print(re.search('\*+', 'aa')) # None print(re.search('\*+', 'a*a')) print(re.search('\*+', 'a***a')) print(re.search('\*+', 'a')) # None print(re.search('\*+', '**'))📄결과값
None <re.Match object; span=(1, 2), match='*'> <re.Match object; span=(1, 4), match='***'> None <re.Match object; span=(0, 2), match='**'>
✅띄어쓰기 구분하기( \b / \B )
- \b: 단어 구분이다면 보통 whitespace에 의해 구분된다.
>>> p = re.compile(r'\bclass\b') >>> print(p.search('no class at all')) <re.Match object; span=(3, 8), match='class'>위에 상황을 보면 class를 기준으로 앞뒤에 공백에 있는 것이 \bclass\b와 일치하므로 매치가 될 수 있다.
반면에 아래와 같은 경우는 앞뒤에 무언가 붙어있으므로 매치가 될 수 없다.
>>> print(p.search('the declassified algorithm')) None >>> print(p.search('one subclass is')) None- \B: \b와 반대되는 경우로 whitespace로 구분된 단어가 아닌 경우에 매치된다.
>>> p = re.compile(r'\Bclass\B') >>> print(p.search('no class at all')) None >>> print(p.search('the declassified algorithm')) <re.Match object; span=(6, 11), match='class'> >>> print(p.search('one subclass is')) None\B같은 경우에 앞뒤에 한곳이라 whitespace가 존재할 경우 매치가 안되는 것을 알 수 있다.
*참고 사이트 및 교재: 점프투 파이썬
영상 : (https://www.youtube.com/watch?v=dTDoTR0MXjU&list=RDCMUCQNE2JmbasNYbjGAcuBiRRg&start_radio=1&rv=dTDoTR0MXjU&t=4)
참고자료: https://wikidocs.net/4309'파이썬' 카테고리의 다른 글
[python]정렬 알고리즘 (0) 2021.10.23 [python] Regular Expression(정규표현식) #Step2 (0) 2021.10.23 파이썬 기초7,Quiz (0) 2021.07.19 파이썬 class_예제문제 (0) 2021.07.18 파이썬 기초6 (0) 2021.07.18