«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Recent Posts
Today
Total
관리 메뉴

짜리몽땅 매거진

[Python] 정규표현식 본문

Data/Python

[Python] 정규표현식

쿡국 2023. 8. 14. 18:38

정규표현식 match/search/findall

 

정규표현식 (regular expression)¶
일정한 문자열의 규칙이나 패턴을 표현하는 방법

find, 기타 문자열 문법 있는데이 문법은 한정되어 있는 부분이 있다.

문법으로 만들 수 있는 규칙이 있지만, 문법으로 만들 수 없는 규칙

이런 규칙, 패턴은 -> 분석가가 원하는 상황에서 나오게 된다.

문자열 데이터를 전처리하는데, 주민등록번호 앞자리와 뒤에 한자리만 추출하고 싶다.

000000-0 패턴

회원가입시 아이디에 대한 규칙

대문자는 사용x 처음에는, 특수문자사용불가-> 이런 데이터를 추출해야 한다.

정규표현식이 다양한 패턴들을 직접 본인이 만들어서 추출할 수 있게 한다.

정규표현식의 원리를 알면 정규표현식들을 더하고, 더해서 새로운 패턴을 만들 수 있다.

import re #정규표현식 모듈 불러오기
match함수와 search함수가 있다.
사용법은 re.match('내가 찾을 패턴','데이터(문자열)')
re.match('rnr','rnrwnsgh')
<re.Match object; span=(0, 3), match='rnr'>
re.match('rnr','rnrwnsghrnr') #match는 뒤까지 찾지 못한다.
<re.Match object; span=(0, 3), match='rnr'>
re.match('rnr','wnsghrnr')#match는 무조건 앞에 없으면 반환X
정규표현식은 여러가지 특수문자를 이용해서 확장한다.

문자열 앞에 ^ 을 붙이면 문자열이 맨 앞에 오는지 판단

문자열 뒤에 $ 를 붙이면 문자열이 맨 뒤에 오는지 판단

match - 가장 맨 앞에 인덱스에서 해당하는 패턴이 있는지 보고 없으면 바로 스킵

search - 전체를 확인하고 매칭이되는 패턴을 찾아준다.

re.search('rnr','wnsghrnr') #search는 찾아줌
<re.Match object; span=(5, 8), match='rnr'>
re.match('rnr|wnsgh','rnr wnsgh') # |를 사용해서 둘 중에 하나만 찾기도 가능
<re.Match object; span=(0, 3), match='rnr'>
1개이상의 패턴을 찾아야 하는 경우

정규식에서 숫자를 표현할 때

[] 대괄호 안에 값을 넣어서 패턴을 표시한다.

숫자,한글,알파벳(대소문자),특수문자

숫자를 찾고 싶은데 모든 숫자를 표현하는 방법은 [0-9] # 모든 숫자를 뜻한다.

'*' 이 특수문자가 0개 이상 있는지 확인

'+' 1개 이상 있는지 확인

re.match('[0-9]','3466464646') #맨 앞의 숫자만 찾는다
<re.Match object; span=(0, 1), match='3'>
re.search('[0-9]','3466464646') #search도 마찬가지
<re.Match object; span=(0, 1), match='3'>
re.match('[0-9]+','3466464646')#이럴때 뒤에 +를 붙여주면 다 찾아줌.
<re.Match object; span=(0, 10), match='3466464646'>
re.search('[0-9]+','3466464646') #search도 마찬가지
<re.Match object; span=(0, 10), match='3466464646'>
re.search('[0-9]+','내 이름은 국준호 5007') 
<re.Match object; span=(10, 14), match='5007'>
영문, 한글

영문 a-z ,A-Z

한글 가-힣, ㄱ-ㅎ, ㅏ-ㅣ

대괄호안에 패턴을 만들 수 있다.

re.search('[가-힣]','내이름은 국준호 5007') 
<re.Match object; span=(0, 1), match='내'>
re.search('[가-힣]+','내이름은 국준호 5007') 
<re.Match object; span=(0, 4), match='내이름은'>
re.search('[a-z]+','내이름은 국준호 rnrwnsgh RNRWNSGH 5007') 
<re.Match object; span=(9, 17), match='rnrwnsgh'>
re.search('[A-Z]+','내이름은 국준호 rnrwnsgh RNRWNSGH 5007') 
<re.Match object; span=(18, 26), match='RNRWNSGH'>
re.search('[ㄱ-ㅎ]+','내이름은 국준호 rnrwnsgh RNRWNSGH 5007') #자음으로만 된 것은 없으니 반환X
re.search('[ㅏ-ㅣ]+','내이름은 국준호 ㅏㅣ rnrwnsgh RNRWNSGH 5007')
<re.Match object; span=(9, 11), match='ㅏㅣ'>
re.search('[ㅏ-ㅣa-zA-Z가-힣 ]+','내이름은 국준호 ㅏㅣ rnrwnsgh RNRWNSGH 5007')
<re.Match object; span=(0, 30), match='내이름은 국준호 ㅏㅣ rnrwnsgh RNRWNSGH '>
re.search('(rnr){4}','wnsghrnrrnrrnrrnr')#이렇게 {개수}를 통해서 패턴을 찾을수있다
<re.Match object; span=(5, 17), match='rnrrnrrnrrnr'>
not
특정 문자 범위 포함되지 않는지 판단하는 것
[^범위]*
[^범위]+
re.search('[^A-Z]+','내이름은 국준호 rnrwnsgh RNRWNSGH 5007') 
<re.Match object; span=(0, 18), match='내이름은 국준호 rnrwnsgh '>
변수에 넣는 방식으로도 가능
a=re.search('([0-9]+)([a-z]+)', '1234abcd')
a.group(1) #group을 활용해서 따로 패턴을 찾을수도 있다
'1234'
a.group(2)
'abcd'
a.group(0)
'1234abcd'
정규식을 이용한 문자열 패턴 문법
re.findall('패턴','문자열')

a=re.findall('[a-z]+','국준호는 브다의 학회원 rnrwnsgh qmek gkrghldnjs')
a #findall을 사용하면 패턴을 모두 찾아주고 리스트로까지 출력해줌.
['rnrwnsgh', 'qmek', 'gkrghldnjs']
문자열을 바꿔보기!
기존 문자열을 내가 원하는 문자열 바꿀 수 있다.

전체 데이터에서 내가 특정원하는 데이터만 원하는 값으로 바꿀 수 있다.

민감한 정보는 다 찾아서 바꾸는 것

re.sub('패턴', '바꿀문자열','문자열',바꿀횟수)

re.sub('rnr','국','rnr준호는 바보')
'국준호는 바보'

* 추가 과제1

필수과제1
'*' 이 특수문자가 0개 이상 있는지 확인

'+' 1개 이상 있는지 확인

두 개의 차이를 주석으로 설명하고 실제 코드를 통해서 비교해서 보여주세요!

import re
re.search('ca*t','ct') # *의 경우 a옆에 입력했는데 0번 반복되어도 매치가 되므로 ct가 출력된다.
<re.Match object; span=(0, 2), match='ct'>
re.search('ca+t','ct') # +의 경우 a옆에 입력했는데 1번이상 반복되어야하므로 반환되지 않는다.

* 추가 과제2

필수과제2
이메일 주소 패턴을 찾는 정규표현식을 만들어 주세요!

asdfasd@gmail.com

asdfa1234@naver.com

여러가지가 있다.

대문자는 사용불가하고, 처음 문자는 숫자는 불가, 특수문자사용 불가

@ 회사이름

@영문.com

@ 뒤에 대문자는 사용 불가한다.

import re
email_input=input('이메일을 입력하세요 : ')
​
if re.search('[a-z]+[a-z0-9]+@[a-z]+.com', email_input) and email_input:
    print('참')
else:
    print('거짓')

'Data > Python' 카테고리의 다른 글

[Python] 텍스트문법 응용  (0) 2023.08.29
[Python] 모듈 패키지  (0) 2023.08.25
[Python] if, for문 응용한 퀴즈 만들기  (0) 2023.08.03
[Python] 딕셔너리 set/def/lambda  (0) 2023.07.24
[Python] 문자열 데이터 응용  (0) 2023.07.19