25. 05. 14 공부일지

behumble·2025년 5월 14일

공부일지

목록 보기
14/20

회고

  • 정규식을 공부하면서 다양한 함수(match, search, findall, finditer)와 패턴 작성법을 익혔다. 처음엔 복잡했지만 직접 예제를 만들고 패턴을 테스트하면서 점점 익숙해졌다. 특히 패턴이 조금만 달라도 결과가 달라진다는 걸 느꼈고, 실습이 중요하다는 걸 깨달았다. 띄어쓰기에 유의하자!

Key_point

✅ 정규식

  • re는 정규표현식을 사용하기 위한 내장 모듈(사용법 : import re)
  • match(), search(), fildall(). finditer()등 기초적인 정규식 함수 사용법과 어떤 값을 반환하는지 기억하기
  • import re -> pattern 설정 -> re.compile(pattern)
    -> 원하는 값을 계산 -> 출력의 순으로 이어진다.
  • pattern은 만들어보려하지말고 gpt한테 물어봐라. 직접 만들 이유가 없다. 또한 띄어쓰기에 유의해라

필기

정규식

비_findall()

  • findall(pattern, string)
    -- 문자열 전체에서 일치하는 모든 결과를 찾아 리스트로 반환
  • escape를 무력화해야하기에 패턴문자열 앞에 r을 꼭 붙이자.
import re
pattern = r"비" #문자열\ : 기본적으로 escape로 사용한다.
                #하지만 패턴에서는 \의 escape기능을 무력화 해야한다.
                #꼭 패턴 문자열앞에 r을 붙여야한다.
text = "하늘에 비가 오고 있습니다. 어제도 비가 왔고 오늘도 비가 오고 있습니다."

regex = re.compile(pattern)
result = regex.findall(text) #비가 몇번들어갔는지 확인
print(result)

비_match()

  • match(pattern, string)
    -- 문자열의 시작이 정규식의 패턴인가?
    -- 시작에서 일치하면 Match 객체반환, 아니면 None
import re
zipcode = input("우편번호를 입력하세요 : ")
pattern = r"\d{5}$" #5자리로 끝나는 정수
regex = re.compile(pattern) #컴파일을 함
result = regex.match(zipcode) #match : 시작에서 일치안하면 None반환 일치하면 match 객체 반환
if result != None: 
    print("형식이 일치합니다.")
else:
    print("잘못된 형식입니다.")

star_match()

  • match(pattern, string)
    -- 문자열의 시작이 정규식의 패턴인가?
    -- 시작에서 일치하면 Match 객체반환, 아니면 None
  • group() : 매칭된 부분의 실제 문자열 반환
  • start() : 매칭된 부분의 시작인덱스 반환
  • end()의 매칭된 부분의 끝인덱스 반환
import re

text1 = "I like star"
text2 = "starship is beautiful"

pattern = "star" #정규표현식 패턴으로 "star"를 찾겠다.
print(re.match(pattern,text1)) #"star"로 시작하는가? None
print(re.match(pattern,text2)) #"star"로 시작하는가? match객체가 반환

matchObj = re.match(pattern,text2) #
print(matchObj.group()) #group()은 매칭된 문자열 자체를 반환 : star
print(matchObj.start()) #start()는 매칭된 문자열 인덱스를 반환 : 0
print(matchObj.end()) #end()는 매칭된 문자열의 끝 인덱스를 반환 : 4
  • search(pattern, string)
    -- 문자열 전체를 검색해서 처음으로 일치하는 부분을 찾음
    -- 일치하면 Match 객체반환, 아니면 None
  • span() : 매칭된 부분의 (시작인덱스,끝인덱스) tuple형식 반환
import re

text1 = "I like star, red star, yellow star"
text2 = "star is beautiful"

pattern = "star" # 패턴설정
print(re.search(pattern, text1)) #문자열전체에서 처음 나오는 매칭을 찾는다.
print(re.search(pattern, text2)) #문자열전체에서 처음 나오는 매칭을 찾는다.
                                 #위 print 둘다 객체를 반환
                                 
matchObj = re.search(pattern, text1)  #text1에서 star를 찾고 matchobj에 저장
print(matchObj.group()) #매칭된 실제 문자열 반환
print(matchObj.start()) #매칭된 부분의 시작 인덱스 반환
print(matchObj.end()) #매칭된 부분의 끝 인덱스 반환
print(matchObj.span()) #매칭된 부분의 (시작인덱스, 끝인덱스) 반환(tuple)

matchObj = re.search(pattern, text2)
print(matchObj.group())
print(matchObj.start())
print(matchObj.end())
print(matchObj.span())

번호, 이메일 추출_findall()

  • findall(pattern, string)
    -- 문자열 전체에서 일치하는 모든 결과를 찾아서 리스트로 반환
    -- 반환하는 각 항목은 문자열(str)임
import re

text = """
phone : 010-0000-0000 email:test1@nate.com
phone : 010-1111-1111 email:text2@naver.com
phone : 010-2222-2222 email:test3@gmail.com
"""
print() #줄바꿈
print("---전화번호 추출하기---")
phonepattern = r"\d{2,3}-\d{3,4}-\d{4}" #전화번호 패턴
                #숫자 2~3자리 - 숫자 3~4자리 - 숫자 4자리

matchObj = re.findall(phonepattern, text) #text안에서 phone을 찾아 리스트로 반환

for item in matchObj:
    print(item)

print("--- 이메일 추출하기 ---")
emailpattern = r"\b[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}\b" #이메일 패턴

matchObj = re.findall(emailpattern, text) #text안에서 email을 찾아 리스트로 반환
for item in matchObj:
    print(item)
print()

번호 추출_finditer()

  • finditer(pattern, string)
    -- 문자열 전체에서 일치하는 모든 결과를 Match 객체로 반환
    -- 반환하는 각 항목은 문자열(str)임
import re

text = """
phone : 010-0000-0000 email:test1@nate.com
phone : 010-1111-1111 email:text2@naver.com
phone : 010-2222-2222 email:test3@gmail.com
"""
print() #줄바꿈
print("---전화번호 추출하기---")
phonepattern = r"\d{2,3}-\d{3,4}-\d{4}" #전화번호 패턴

matchObj = re.finditer(phonepattern, text) #text에서 phone을 찾아 객체로 반환
for item in matchObj:
    print(item.group()) #매칭된 문자열 그대로 반환
    print(item.span()) #매칭된 문자열의 (시작인덱스,종료인덱스) tuple로 반환
print()

abc_search(), ^abc

  • ^abc : 문자열이 abc로 시작하는가?
import re

pattern = r"^abc" #문자열이 abc로 시작하는 것이 패턴
# Pattern = r"abc$" #문자열이 abc로 끝나는 것이 패턴
text = ["abc", "abcd", "abc15", "dabc","","s"]
repattern = re.compile(pattern)

for item in text:
    result = repattern.search(item) #문자열 전체를 검색해서 처음 일치하는 부분을 찾는다.
    if result:
        print(item, "--O") #검색결과가 있으면 O
    else:
        print(item, "--X") #검색결과가 없으면 X

pPython_search(),match()

  • search()와 match()의 사용법 차이에 대해 숙지
import re
pattern = r"[pP]ython"
text = ["python", "Python", "PYTHON", "12python", "python3"]
repattern = re.compile(pattern) #정규식패턴을 미리 컴파일해서 효율적인 검색가능.

for item in text:
    result = repattern.search(item) #문자열 전체에서 python or Python이 포함됐는지 확인
    if result:
        print(item, "--O")
    else:
        print(item, "--X")

pattern = r"[A-Z]" #알파벳 대문자 하나라도 있는가
text = ["python", "Python", "PYTHON", "korea", "Korea", "KOREA"]
repattern = re.compile(pattern)
for item in text:
    result = repattern.search(item) #문자열 전체에 대문자가 하나라도 있는지
    #match함수는 첫 시작만을 보기 때문에 활용불가
    if result:
        print(item, "--O")
    else:
        print(item, "--X")

복습

gpt를 이용한 유사예제

전화번호 형식 판별

  • match를 이용하여 전화번호가 11자리의 숫자인지 확인
# 사용자로부터 전화번호를 입력받고, 010으로 시작하며 '-' 없이 총 11자리 숫자인지 검사하는 프로그램을 작성하세요.
# 정상적인 형식이면 "올바른 전화번호입니다."를 출력하고, 아니라면 "전화번호 형식이 잘못되었습니다."를 출력하세요.

import re
phone_num = input("전화번호를 입력하세요 : ")
pattern = r"\d{11}$" #11자리 숫자인지 확인
regex = re.compile(pattern)
result = regex.match(phone_num)
if result != None:
    print("올바른 전화번호입니다..")
else:
    print("전화번호 형식이 잘못되었습니다.")

이메일주소 필터링

  • findall()을 활용
  • import re, 패턴설정, 컴파일, 원하는 값 찾기의 순서를 잊지말자
# 정규표현식으로 이메일을 추출해야 함
# 도메인이 naver.com 또는 gmail.com인 경우만 출력
# findall() 또는 finditer() 중 하나를 사용
import re

content = """
이메일: kim123@naver.com  
이메일: park77@gmail.com  
이메일: lee456@daum.net  
이메일: hong99@naver.com  
이메일: choi@kakao.com
"""
pattern = r"\b[a-zA-Z0-9._%+-]+@(?:naver|gmail)\.com\b"
regex = re.compile(pattern)
result = regex.findall(content)

for email in result:
    print(email)

차량번호판 추출_findall(),finditer()

  • findall(), finditer() 사용
# 숫자2~3자리 + 한글 1글자 + 공백 + 숫자 4자리 형태만 모두 추출하시오.

import re

content = """
오늘 도로에서 본 차량은 12가 3456이었고,
친구 차는 123나 6789였다.
잘못된 번호인 12가345는 제외해야 하며,
번호판이 없는 차도 있다.
또 다른 차량은 99가 0001이었다.
"""
pattern = r"\d{2,3}[가-힣]\s\d{4}"
regex = re.compile(pattern)
# result = regex.findall(content) # findall 사용
# for num in result: # findall 사용
#     print(num)

result = regex.finditer(content) # finditer 사용
for item in result: # finditer 사용
    print(item.group())
    print(item.span())

차량번호판추출_search(),match()

# 차량번호판추출
# 다음 문자열에서 차량 번호판(예: 12가 3456, 123나 6789)을 찾아 출력하시오.
# 번호판이 없으면 "차량 번호판이 없습니다."라고 출력하세요.
import re

text = "오늘 도로에서 본 차량은 12가 3456이었고 친구 차는 123나 6789였다."
pattern1 = r"\d{2,3}[가-힣]\s\d{4}" #search() 함수에 사용예정

regex1 = re.compile(pattern1)
result1 = regex1.search(text) # search()를 통해 처음으로 일치하는 부분 찾음
result1

if result1 == 0:
    print("차량 번호판이 없습니다.")
else:
    print(result1)
    
pattern2 = r"\d{2,3}[가-힣]\s\d{4}"
regex2 = re.compile(pattern2)
result2 = regex2.match(text)

if result2 != None:
    print("차량번호가 맨 앞에 있습니다.")
else:
    print("문장앞에 차량 번호가 없습니다.")

0개의 댓글