Python
Python 정규식
안드로이
2022. 1. 15. 22:14
문자열 검색이나 입력된 문자열이 정해진 포멧에 적합한지 확인
정규식 테스트 사이트
@ 정규식
- /.../ 속에 패턴을 표시
- \d : 0부터 9까지 숫자
- \w : 숫자와 문자(대소문자 포함), _ 포함
- \s : 공백문자
- . : \n을 제외한 모든 문자
- . : . 문자, [] 안에서 사용시
- \. : . 문자, [] 밖에서 사용시
- [] : []속에 글자들은 순서에 관계없이 한글자를 표현
- ? : 0 또는 1번 발생
- * : 0 또는 여러번 발생
- + : 1번 이상 발생
- {n} : n번 발생
- {1,2} : 1번 또는 2번 발생
- [a-zA-Z0-9.-] : 영문 대소문자, 숫자, ., - 중 1글자
- [a-zA-Z0-9.-]+ : 영문 대소문자, 숫자, ., - 를 사용하는 1글자 이상
- \.(com|net|co.kr) : .com 또는 .net 또는 .co.kr
- ^ : 시작을 표시
- $ : 끝을 표시
- \b : 바운더리를 표현, 시작과 끝에 표현
- r'...' : '...'안에 이스케이프(\) 문자 없이 문자 자체로 인정
@ 정규식 패턴 검색
- match() : 원하는 문자열 패턴으로 소스 문자열과 일치하는지 비교
result = re.match('hello', 'hello world') # 'hello'는 패턴, 'hello world'는 확인할 소스 문자열
result가 None이면 매칭이 실패했다는 의미
- 패턴을 미리 컴파일 할 수 있다
mypattern = re.compiler(r'\d\d\d-\d\d\d\d-\d\d\d\d')
- search() : 첫번째 일치하는 객체를 반환
- findall() : 모두 일치하는 문자열을 리스트로 반환
- split() : 패턴에 맞게 소스를 쪼갠후 문자열 조각의 리스트를 반환
- sub() : 바꾸기 기능, 패턴과 일치하는 소스의 부분을 대체인자로 변경
# 정규식 그룹핑 : 괄호를 사용하여 정규식에 그룹을 생성할 수 있다.
# 만약 () 문자 자체를 사용하려면 \(, \) 를 사용
import re
phonenum_regex = re.compile(r'(\d\d\d)-(\d\d\d\d)-(\d\d\d\d)')
mo = phonenum_regex.search('My number is 010-3333-4444')
print(mo.group()) # 010-3333-4444
print(mo.group(0)) # 010-3333-4444
print(mo.group(1)) # 010
print(mo.group(2)) # 3333
print(mo.group(3)) # 4444
first, second, third = mo.groups()
print(first + ' ' + second + ' ' + third) # 010 3333 4444
# 정규식 이메일 예제
import re
email_regex = re.compile(r'''(
[a-zA-Z0-9._%+-]+ # username
@ # @ symbol
[a-zA-Z0-9.-]+ # domain name
(\.[a-zA-Z]{2,4}){1,2} # dot-something, .co.kr, .com, .net
)''', re.VERBOSE)
# re.I : 대소문자 구분 안함
# re.VERBOSE : 복잡한 정규식 표현
em = email_regex.search('제 이메일 주소는 aaa111@naver.com 입니다. 다른 메일은 cc343@kakao.com 입니다.')
print('email object:',em)
print('email:', em.group(), em.start(), em.end(), em.span())
em2 = email_regex.findall('제 이메일 주소는 aaa111@naver.com 입니다. 다른 메일은 cc343@kakao.com 입니다.')
print('emails:', em2)
출력값
email object: <re.Match object; span=(10, 26), match='aaa111@naver.com'>
email: aaa111@naver.com 10 26 (10, 26)
emails: [('aaa111@naver.com', '.com'), ('cc343@kakao.com', '.com')]