[파이썬] 정규식
by mini_min[파이썬] 정규식
🖋️ 파이썬 정규식
: 파이썬 정규식은 re 라는 표준 패키지를 이용한다.
import re
# 파이썬 정규식은 re 라는 표준 패키지를 이용
# math(pattern, string, flag)
# : 해당 패턴으로 문자열이 시작하는지 판단, 시작하지 않으면 None
print(re.match("a", "abc")) #<re.Match object; span=(0, 1), match='a'>
print(re.match("b", "abc"))
print(re.match("c", "abc"))
print("---------------")
# search(pattern, string, flag)
# : 해당 패턴으로 문자열이 포함되어 있는지 판단, 포함되어 있지 않으면 None
print(re.search("a", "abc")) #<re.Match object; span=(0, 1), match='a'>
print(re.search("b", "abc")) #<re.Match object; span=(1, 2), match='b'>
print(re.search("c", "abc")) #<re.Match object; span=(2, 3), match='c'>
print("---------------")
# findall(pattern, string, flag)
# : 해당 패턴에 맞는 케이스를 모두 찾아서 리스트로 반환
print(re.findall("a", "a"))
print(re.findall("a", "aba")) #['a', 'a']
print(re.findall("a", "baa")) #['a', 'a']
print(re.findall("aaa", "aaaaa"))
print(re.findall("aaa", "aaaaaa")) #['aaa', 'aaa']
print(re.findall("\d", "숫자102에 30을 더하면 132")) #['1', '0', '2', '3', '0', '1', '3', '2']
print(re.findall("\d+", "숫자102에 30을 더하면 132")) #['102', '30', '132']
print("---------------")
# finditer(pattern, string, flag)
# : 해당 패턴에 맞는 케이스를 모두 찾아서 iterator 로 반환
a = re.finditer("a", "baa") #<re.Match object; span=(1, 2), match='a'>
#<re.Match object; span=(2, 3), match='a'>
for s in a:
print(s)
print("---------------")
# fullmatch(pattern, string, flag)
# : 문자열에 시작과 끝이 정확하게 패턴과 일치
print(re.fullmatch("a", "a"))
print(re.fullmatch("a", "aaa"))
print(re.fullmatch("a", "aba"))
: split, sub (교체), subn(변환 결과가 튜플), compile 은 정규식 여러번 사용할 때 사용
import re
# split(pattern, string, max_split_count, flag)
# : 문자열에서 패턴으로 문자열을 쪼개서 리스트로 반환
print(re.split("a", "abaabca")) #['', 'b', '', 'bc', '']
print(re.split("a", "abaabca", 2))
# ['', 'b', 'abca']
print("--------------------")
#sub(pattern, change_string, string, max_change_count, flag)
# : 문자열에 맞는 패턴을 2번째 인자의 문자열로 교체함
print(re.sub("a", "z", "ab")) #zb
print(re.sub("a", "zxc", "ab")) #zxcb
print(re.sub("a", "z", "aaaab")) #zzzzb
print(re.sub("a", "z", "aaaab", 1)) #zaaab
print("--------------------")
#subn (pattern, change_string, string, max_change_count, flag)
# : sub() 와 동일하지만 변환 결과가 (문자열 매칭횟수) 형식의 튜플이다.
print(re.subn("a", "z", "ab")) # ('zb', 1)
print(re.subn("a", "zxc", "ab")) #('zxcb', 1)
print(re.subn("a", "z", "aaaab")) #('zzzzb', 4)
print(re.subn("a", "z", "aaaab", 1)) #('zaaab', 1) 1번만 교체
print("--------------------")
# compile(pattern, flag)
# : 정규식 컴파일, 정규식을 여러번 사용할 때 이용 가능하다.
c = re.compile("a")
print(c.sub("zxc", "abcdefg"))
print(c.search("vcabcdefg"))
print("--------------------")
# escape(pattern)
# : 패턴을 이스케이프(\) 처리하여 반환
print(re.escape('(\d)')) # \(\\d\)
: 정규식에서 () 는 그룹을 의미한다. 그룹화 하고 싶으면 () 가로 안에 넣으면 된다.
import re
# match 객체 : match(), search() 함수를 수행 후 반환되는 객체
result = re.search("aa", "baab")
print(result.group()) # aa
# match객체의 group() : 매치된 문자열 반환
print(result.start()) # aa
# match객체의 start() : 매치된 문자열의 시작 위치 반환
print(result.end()) # aa
# match객체의 end() : 매치된 문자열의 끝 위치 반환
print(result.span()) # aa
# match객체의 span() : 매치된 문자열의 (시작, 끝)에 해당하는 튜플 반환
# 정규식에서 ()는 그룹을 의미한다.
result = re.match("(\d{2})-(\d{3,4})-(\d{4})", "02-123-1234")
print(result.groups())
print(result.group())
print(result.group(0))
print(result.group(1))
print(result.group(2))
print(result.group(3))
print()
# 패턴에 이름주기 : ?p<이름>
result = re.match("(?p<front>\d{2})-(?p<middle>\d{3,4})-(?p<rear>\d{4}", "02-123-1234")
print(result.groupdict()) # 패턴에 주어진 이름을 키로하여 dict 객체 생성
: 문자열에서 특수문자, 숫자만 남기기, 숫자만 제거하기.
sub 로 정규식을 작성해준다.
import re
# 문자열에서 특수문자 제거(영문자, 한글, 숫자만 제외하고 제거)
string = "AA**&^bb& 95 가나다 CC-123"
text = re.sub("[^가-힣0-9a-zA-Z\s]", "", string)
print(text)
print(f"{'-' * 80}\n")
# 숫자만 남기기
string = "AA**&^bb& 95 가나다 CC-123"
text = re.sub("[^0-9]", "", string)
print(text)
print(f"{'-' * 80}\n")
# 숫자만 지우기
string = "AA**&^bb& 95 가나다 CC-123"
text = re.sub("[0-9]", "", string)
print(text)
print(f"{'-' * 80}\n")
: 반환하고 싶으면, 특정 문자열을 findall 하여 찾아낸다.
import re
text = "Java Spring Oracle !!! 123 @#$ 한글"
# 소문자만 리스트로 반환, +는 1번이상
print(re.findall("[a-z]+", text))
print("-----------------")
# 소문자만 리스트로 반환, ?는 0번, 1번
print(re.findall("[a-z]?", text))
print("-----------------")
# 소문자만 리스트로 반환, *는 0번, 1번이상
print(re.findall("[a-z]*", text))
print("-----------------")
# 소문자, 대문자, 숫자룰 리스트로 반환, +는 1번이상
print(re.findall("[a-zA-Z0-9]+", text)) #['Java', 'Spring', 'Oracle', '123']
print("-----------------")
#주민번호 뒷자리 *로
string = "011010-3111111"
print(re.sub("-[0-9]{7}", "-******", string))
print("-----------------")
string = "java:spring:oracle"
print(re.split(":", string))
print("-----------------")
# 엔터로 분리하여 list로 반환
text = """홍 길동: 2000.10.10 seoul java
다 자바: 2000.09.15 seoul java
너 길동: 2001.08.20 jeju oracle
하 길동: 2000.07.13 busan java
이 길동: 2001.08.15 seoul html
마 길동: 2000.09.08 seoul java"""
print(re.split("\n", text))
print("-----------------")
: 전화번호 가져와서 출력하기
search 하여 찾아내고 group 으로 묶어서 출력한다.
import re
text = "문의사항이 있으면 010-1111-2222 으로 연락주시기 바랍니다."
# 전화번호만 가져오기
print(re.findall("[0-9]{3}-[0-9]{4}-[0-9]{4}", text))
mobj = re.search("\d{2,3}-\d{3,4}-\d{4}", text)
tel = mobj.group()
print(tel)
print("----------")
print("----------")
print("----------")
text = "문의사항이 있으면 010-1111-2222 으로 연락주시기 바랍니다."
#서비스번호(010, 02... )와 전화번호 (1111-2222) 를 분리하여 출력
mobj = re.search("(\d{2,3})-(\d{3,4}-\d{4})", text)
tel = mobj.group()
tel1 = mobj.group(1)
tel2 = mobj.group(2)
print(tel, tel1, tel2)
text = "에러 1122: 레퍼런스 오류\n 에러 1033: 아규먼트 오류"
regex = re.compile("에러 1033")
mobj = regex.search(text)
if mobj:
print(mobj.group())
print(re.split("\n", text))
print("----------")
'Python' 카테고리의 다른 글
| [파이썬] 판다스 pandas (0) | 2022.12.25 |
|---|---|
| [파이썬] JSON (0) | 2022.12.25 |
| [파이썬] 파일 처리 (1) | 2022.12.25 |
| [파이썬] 예외 (0) | 2022.12.25 |
| [파이썬] 모듈 (0) | 2022.12.25 |
블로그의 정보
개발자 미니민의 개발로그
mini_min