개발자 미니민의 개발스터디

[파이썬] 정규식

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

활동하기