250201 학습(복습완료)

송용진·3일 전
0

정규표현식

정규 표현식은
문자열에서 특정한 패턴을 검색하거나 대체하는 데 사용되는
모든 언어에 공통인 강력한 도구
프로그래밍에서 정규 표현식을 이해하고 사용할 수 있다면,
복잡한 문자열 처리 작업을 간단하게 해결할 수 있음

1. 정규 표현식의 필요성

  • 효율적인 문자열 처리
    복잡한 문자열 패턴을 식별하고 처리할 수 있는 효율적인 방법을 제공

  • 데이터 검증
    사용자 입력, 데이터베이스 검색 등에서
    정확한 데이터 형식을 요구할 때 유용

  • 데이터 추출
    대량의 텍스트 데이터에서
    특정 정보(이메일 주소, 전화번호 등)를 추출하는 데 사용됨

2. 관련 구성 요소 및 용어 정리

  • 메타 문자(Meta characters)
    특별한 의미를 가진 문자
    (^, $, , +, ?, |, (), [], {}, .)

  • 리터럴(Literals)
    정규 표현식에서 그 자체로 사용되는 문자
    (a, b, 1, 2)

  • 문자 클래스(Character classes)
    특정 문자 집합을 나타내는 메타 문자
    ([a-z], \d, \w)

  • 양자화자(Quantifiers)
    특정 문자 또는 패턴이 몇 번 나타나는지 지정
    ( , +, ?, {n}, {n,}, {n,m})

  • 플래그(Flags)
    정규 표현식의 검색 방식을 조정(대소문자 구분 무시 등)

3. 활용 사례

  • 이메일 주소 검증
    입력된 문자열이 이메일 주소 형식에 맞는지 검사
  • 로그 파일에서 특정 패턴 검색
    서버 로그 파일에서 오류 메시지나 특정 IP 주소 등을 찾음
  • 데이터 정제
    웹 페이지에서 HTML 태그 제거, 공백 제거 등의 데이터 정제 작업을 수행

4. 실습

ㄱ. 문자 클래스

문자 클래스는 정규 표현식에서
특정한 세트의 문자 중 하나와 일치시키기 위해 사용되는 패턴
문자 클래스를 사용하면, 개별 문자를 나열하는 방식으로
여러 문자 중 하나와 일치하는 조건을 정의할 수 있음
문자 클래스는 대괄호 [] 안에 문자를 나열하여 생성

문자 클래스의 기본 사용

  • [abc]
    "a", "b", 또는 "c" 중 하나와 일치
    예를 들어, "a"는 이 패턴과 일치


  • [^abc]
    "a", "b", "c"를 제외한 모든 문자와 일치
    즉, ^ 는 문자 클래스 안에서 사용될 때 부정을 의미


  • [a-z]
    "a"부터 "z"까지의 소문자 알파벳 중 하나와 일치


  • [A-Z]
    "A"부터 "Z"까지의 대문자 알파벳 중 하나와 일치


  • [0-9]
    "0"부터 "9"까지의 숫자 중 하나와 일치


  • [a-zA-Z]
    모든 소문자 및 대문자 알파벳 중 하나와 일치


  • [a-zA-Z0-9]
    모든 알파벳 문자 및 숫자 중 하나와 일치

특수 문자 사용

  • 문자 클래스 내에서 대부분의 메타 문자는
    그 특별한 의미를 잃고 문자 그대로 해석됨
    예를 들어, [.] 는 문자 "."과 정확히 일치


  • - (하이픈)은 문자 범위를 지정할 때 사용됨
    (예: [a-z])


  • ^ (캐럿)은 문자 클래스의 시작 부분에 위치할 때만
    부정 문자 클래스를 정의하는 데 사용됨
    (예: [^a-z] 는 소문자 알파벳을 제외한 모든 문자와 일치)

ㄴ. 메타문자

주요 메타 문자

  • . (점)
    임의의 단일 문자와 일치(단, 줄바꿈 문자 \n 은 제외)
    예를 들어, a.bacb, aab, a3b와 일치하지만,
    a\nb 와는 일치하지 않음


  • ^ (캐럿)
    문자열의 시작과 일치
    예를 들어, ^Hello 는 "Hello"로 시작하는 문자열과 일치


  • $ (달러)
    문자열의 끝과 일치
    예를 들어, end$ 는 "end"로 끝나는 문자열과 일치


  • *(별표)
    바로 앞의 문자(또는 패턴)가 0번 이상 반복되는 경우와 일치
    예를 들어, ab* 는 "a", "ab", "abb", "abbb" 등과 일치


  • + (플러스)
    바로 앞의 문자(또는 패턴)가 1번 이상 반복되는 경우와 일치
    예를 들어, ab+ 는 "ab", "abb", "abbb" 등과 일치하지만,
    "a"와는 일치하지 않음


  • ? (물음표)
    바로 앞의 문자(또는 패턴)가 0번 또는 1번 나타나는 경우와 일치
    예를 들어, ab? 는 "a", "ab"와 일치하지만, "abb"와는 일치하지 않음


  • {n} (중괄호)
    바로 앞의 문자(또는 패턴)가 정확히 n번 반복되는 경우와 일치
    예를 들어, a{3} 는 "aaa"와 일치


  • {n,}
    바로 앞의 문자(또는 패턴)가 n번 이상 반복되는 경우와 일치


  • {n,m}
    바로 앞의 문자(또는 패턴)가 최소 n번, 최대 m번 반복되는 경우와 일치


  • [...] (대괄호)
    대괄호 안에 포함된 어떤 한 문자와 일치
    예를 들어, [abc] 는 "a", "b", "c" 중 하나와 일치


  • [^...]
    대괄호 안에 포함되지 않은 어떤 한 문자와 일치
    예를 들어, [^abc] 는 "a", "b", "c"를 제외한 어떤 한 문자와 일치


  • | (파이프)
    OR 조건을 나타내며, | 기호로 구분된 두 패턴 중 하나와 일치
    예를 들어, a|b 는 "a" 또는 "b"와 일치


  • \ (역슬래시)
    메타 문자를 이스케이프하거나 특별한 시퀀스를 나타냄
    예를 들어, \.는 문자 그대로의 점과 일치하고, \d는 숫자와 일치


ㄷ. 문제

기능별 실 사용 사례

  1. 이메일 주소 검증
  • 다음 문자열에서 유효한 이메일 주소를 찾기
    "이메일 주소는 example@example.com입니다."
import re

def find_email(text):
    # 이메일 주소를 찾기 위한 정규 표현식 패턴
    email_pattern = r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}'
    
    # re.findall을 사용하여 모든 이메일 주소를 찾음
    emails = re.findall(email_pattern, text)
    return emails

#예시 문자열
text = "이메일 주소는 example@example.com입니다."
result = find_email(text)
print(result)  # 출력: ['example@example.com']
  1. HTML 태그 제거
  • 다음 HTML 문자열에서 모든 태그를 제거하고 순수 텍스트만 남기기
    "<div>Hello <b>World</b></div>"
import re

def remove_html_tags(html_string):
    # 정규 표현식 패턴: <...> 형태의 모든 태그를 매칭
    clean_text = re.sub(r'<.*?>', '', html_string)
    return clean_text.strip()  # 앞뒤 공백 제거
    '''
    .*?의 경우는 
	"어떤 문자든지 0개 이상"을 찾되, 
    가능한 짧은 문자열을 매칭하려고 함
    
    .*의 경우는 "어떤 문자든지 0개 이상"을 찾으며, 
    가능한 많은 문자를 매칭하려고 함
    
	예를 들어, 문자열 <div>Hello <b>World</b></div>에서
	.*를 사용하면 <div>Hello <b>World</b>와 같이 최대한 긴 문자열을 매칭
	.*?를 사용하면 <div>와 <b> 각각을 짧게 매칭
	'''

# 예시
html_string = "<div>Hello <b>World</b></div>"
result = remove_html_tags(html_string)
print(result)  # 출력: Hello World
  1. 전화번호를 마스킹하는 함수 만들기
  • 010-1234-5678010-1234-****
import re

def mask_phone_number(phone_number):
    # 정규 표현식 패턴
    pattern = r'(\d{3}-\d{4})-\d{4}'
    # 일반 문자열: '\\d{3}-\\d{4}-\\d{4}'
	# raw 문자열: r'\d{3}-\d{4}-\d{4}'

    # 마스킹 처리
    masked_number = re.sub(pattern, r'\1-****', phone_number) # \1은 첫번째 그룹을 의미(그룹은 괄호로 감싸서 나타냄)
    # re.sub는 특정 패턴에 맞는 문자열을 찾아 
    # 다른 문자열로 대체하는 기능을 수행
    return masked_number

# 예시
phone_number = "010-1234-5678"
masked = mask_phone_number(phone_number)
print(masked)  # 출력: 010-1234-****

5. 정리

정규 표현식은 문자열을 처리하는 데 있어 매우 강력한 도구임
정규 표현식을 숙련되게 사용하게 되면,
복잡한 문자열 처리 작업을 효과적으로 해결할 수 있게 됨


re.compile은 주어진 정규 표현식을 컴파일하여
재사용 가능한 패턴 객체를 생성하는 기능을 수행

재사용 가능한 패턴 객체는 정규 표현식을 컴파일하여 생성된 객체로,
이를 사용하면 동일한 정규 표현식을 여러 번 적용할 때
매번 문자열을 컴파일할 필요 없이 성능을 향상시킬 수 있음

즉, 한 번 컴파일된 패턴 객체를 사용하여
다양한 문자열에 대해 검색이나 대체 작업을 수행할 수 있음

profile
백엔드 개발자

0개의 댓글