728x90
정규표현식 개념
문자열 내에서 패턴을 찾거나 변형하는데 사용되는 문자열 패턴 매칭 도구
정규표현식 기본 문법
- 문자 및 메타문자:
- .: 어떤 문자 하나와 일치.
- *: 바로 앞의 패턴이 0번 이상 반복.
- +: 바로 앞의 패턴이 1번 이상 반복.
- ?: 바로 앞의 패턴이 0번 또는 1번 나타남.
- []: 괄호 안의 어떤 문자와 일치.
- (): 괄호 안의 패턴을 그룹으로 묶음.문자 클래스:
- [a-z]: 소문자 a부터 z까지의 문자와 일치.
- [A-Z]: 대문자 A부터 Z까지의 문자와 일치.
- [0-9]: 숫자 0부터 9까지의 문자와 일치.
- 특수 문자:
- \: 이스케이프 문자를 사용하여 특수 문자를 일반 문자로 처리.
- \d: 숫자와 일치.
- \w: 숫자와 문자(알파벳) 및 밑줄(_)과 일치.
- \s: 공백 문자와 일치.
- 앵커:
- ^: 문자열의 시작과 일치.
- $: 문자열의 끝과 일치.
Step 1. 정규표현식 모듈 불러오기
import re # 정규식 모듈 불러온다.
Step2. match & search
- match : 가장 맨 앞에 인덱스에서 해당하는 패턴이 있는지 보고 없으면 바로 스킵
- search : 전체를 확인하고 매칭이 되는 패턴을 찾는다.
re.match('hi','hi,guys')
<re.Match object; span=(0, 2), match='hi'> |
re.match('bye','hi,guys') # 매칭이 안 되면 아무것도 반환되지 않는다.
re.search('hi', 'hi,guys')
<re.Match object; span=(0, 2), match='hi'> |
re.match('hi','hello, hi') # 처음부터 매칭이 안되면 스킵 > 아무것도 출력되지 않는다.
- 여러 문자열 중 하나라도 포함되면 찾기
re.match('hello|hi','hi,python')
<re.Match object; span=(0, 2), match='hi'> |
re.match('hello|hi','python,hi') # 제일 앞에서 찾고 없으면 아무것도 출력 안함
Step 3. 1개 이상의 패턴을 찾아야 하는 경우
정규식에서 숫자를 표현할 때 [] 대괄호 안에 값을 넣어서 패턴을 표시
- 숫자, 한글, 알파벳, 특수문자
- 모든 숫자를 표현하는 방법 : [0-9]
- '*' : 특수문자가 0개 이상 있는지 확인
- '+ ': 1개 이상 있는지 확인
[0-9] 숫자
re.match('[0-9]','8956') # match 맨 앞에만 찾는다. 따라서 8
<re.Match object; span=(0, 1), match='8'> |
re.search('[0-9]','8956')
<re.Match object; span=(0, 1), match='8'> |
re.match('[0-9]+','8956') # + : 1 이상 확인
<re.Match object; span=(0, 4), match='8956'> |
re.search('[0-9]+','8956')
<re.Match object; span=(0, 4), match='8956'> |
re.match('[0-9]+','전화번호뒷자리8956') # 맨 앞자리만 비교 > 아무것도 출력되지 않음
re.search('[0-9]+','전화번호뒷자리8956')
<re.Match object; span=(7, 11), match='8956'> |
[가 - 힣] 문자 : 한글
re.search('[가-힣]', '1234안녕hello')
<re.Match object; span=(4, 5), match='안'> |
re.search('[가-힣]+', '1234안녕hello')
<re.Match object; span=(4, 6), match='안녕'> |
re.search('[가-힣]+', '1234안녕hello안녕')
<re.Match object; span=(4, 6), match='안녕'> |
[a-zA-z가-힣] 문자 : 한글, 영어
re.search('[a-zA-z가-힣]+','1234frameData안녕')
<re.Match object; span=(4, 15), match='frameData안녕'> |
Step 4. 문자 개수 판단하기
{숫자}
re.search('c{4}','cccc') # c를 네번 찾아줘
<re.Match object; span=(0, 4), match='cccc'> |
re.search('c{5}','cccb') #c가 4번이 없어서 촐력되지 않음
# 주민등록번호 패턴
'123456 - 1234567'
re.search('^010-[0-9]{4}-[0-9]{4}$','010-1234-1234')
Step 5. not 사용하기
not(^) : 특정 문자 범위 포함되지 않는지 판단
- [\^범위]*
- * : 바로 앞 패턴이 0번 이상 반복
- [\^범위]+
- + : 바로 앞 패턴이 1번 이상 반복
re.search('[A-Z]+','안녕123') # 해당사항 없음 > 아무것도 출력되지 않음
re.search('[^A-Z]+','안녕123') # not 조건
<re.Match object; span=(0, 5), match='안녕123'> |
Step 6. 간결한 표현 사용하기
- 영문, 한글, 숫자 더 간단하게 표현 가능
- \d : [0-9]
- \D : [\^0-9]
- \w : [a-Za-zo-a9]
- \W : [\^a-Za-zo-a9]]
re.search('\d','8956')
<re.Match object; span=(0, 1), match='8'> |
re.search('\d+','8956') # + 붙이면 전체 다 찾음
<re.Match object; span=(0, 4), match='8956'> |
Step 7. 공백처리
- ' '
- \s
- \S
re.search('([0-9]+) ([a-z]+)', '1234 kim') #공백 있음
<re.Match object; span=(0, 8), match='1234 kim'> |
Step 8. 문자열 패턴 문법
- re.findall('패턴','문자열')
- re.sub('패턴','바꿀문자열', '문자열')
tests = re.findall('[a-z]+', '1234 a 12345 b 12345 c')
tests
['a', 'b', 'c'] |
re.sub('xxx | yyy','cake','aaa bbb ccc xxx yyyy')
'aaa bbb ccc cake yyyy' |
re.sub('[a-z]+','영어',' 1 2 3 4 a b')
1 2 3 4 영어 영어 |
실전1 _ 문자열 패턴 정의, 테스트 하는 함수 만들기
# 문자열 정규표현식 패턴 정의
pattern_plus = "ca+t" # "c" 다음에 "a"가 한 번 이상 반복되고 "t"로 끝나는 패턴
pattern_star = "ca*t" # "c" 다음에 "a"가 0번 이상 반복되고 "t"로 끝나는 패턴
# 테스트할 문자열들
test_strings = ["ct", "cat", "caat", "cast", "ctt"]
# 각 패턴별로 문자열을 검사하여 일치 여부를 출력
for test_string in test_strings:
match_plus = re.match(pattern_plus, test_string)
match_star = re.match(pattern_star, test_string)
print(f"Input: {test_string}")
print(f"Pattern '+' Match: {match_plus is not None}")
print(f"Pattern '*' Match: {match_star is not None}")
print("=" * 20)
실전2_ 이메일 패턴으로 입력받기
<조건>
대문자 사용 불가, 처음 문자, 숫자 불가
특수문자 사용 불가
import re
def Email_check(Email_input):
# Email_input = input("이메일을 입력해주세요 : ")
test0 = re.search('[@]',Email_input)
if test0 is None:
print('이메일 형식이 일치하지 않습니다.')
else:
Email_id = Email_input.split('@')[0]
Email_company = Email_input.split('@')[1]
test1 = re.search('([a-z]+)([0-9]*)([^@#$%^*]([^A-Z]))', Email_id) #처음 시작 : 소문자 1개 이상, 영어
test2 = re.search('[^A-Z]+', Email_company)
if test1 is None or test2 is None:
print("이메일을 형식이 일치하지 않습니다.")
else:
print("이메일 입력 완료")
'Python > Data Analysis' 카테고리의 다른 글
시계열 분석 - 시계열 데이터 특성, ARIMA (1) | 2024.01.08 |
---|---|
Correlation Analytics - 상관계수, 공분산 계산 (0) | 2023.12.01 |
다중 시각화 그래프 (matplotlib, gridspec, seaborn) (1) | 2023.12.01 |
[Python] 시계열 데이터 결측치 처리 (0) | 2023.10.08 |
[Python] 데이터 분석_ Index Alignment (1) | 2023.08.10 |