데이터 분석

정규표현식

temporubato108 2024. 10. 4. 18:34

1. 정규표현식

정규 표현식의 의미

정규 표현식(Regular Expressions, regex)은 문자열에서 특정 패턴을 찾거나 조작하기 위해 사용되는 문자 시퀀스입니다. 정규 표현식은 복잡한 문자열 검색과 치환 작업을 간단하고 효율적으로 수행할 수 있게 해줍니다.

정규 표현식의 활용방법

  1. 텍스트 검색: 특정 단어나 패턴을 포함하는 텍스트를 찾는 데 사용됩니다.
  2. 데이터 유효성 검사: 이메일 주소, 전화번호, 우편번호 등의 형식을 검증하는 데 사용됩니다.
  3. 텍스트 치환: 특정 패턴을 다른 문자열로 바꾸는 데 사용됩니다.
  4. 데이터 추출: 로그 파일, HTML 문서 등에서 필요한 정보를 추출하는 데 사용됩니다.
  5. 데이터 정제: 데이터셋에서 불필요한 공백, 특수 문자 등을 제거하는 데 사용됩니다.

정규 표현식을 사용하는 이유

  1. 효율성: 복잡한 문자열 검색과 치환 작업을 간단한 패턴으로 표현할 수 있어 코드가 간결해집니다.
  2. 유연성: 다양한 패턴을 정의할 수 있어 여러 종류의 문자열 작업에 적용할 수 있습니다.
  3. 강력함: 정규 표현식은 매우 강력한 도구로, 복잡한 텍스트 조작 작업을 효율적으로 수행할 수 있습니다.

2. 기본 패턴

문자 클래스

  1. \d: 숫자 (0-9)

    import re
    text = "There are 3 apples."
    matches = re.findall(r'\d', text)
    print(matches)  # ['3']
  2. \D: 숫자가 아닌 문자

    import re
    text = "There are 3 apples."
    matches = re.findall(r'\D', text)
    print(matches)  # ['T', 'h', 'e', 'r', 'e', ' ', 'a', 'r', 'e', ' ', ' ', 'a', 'p', 'p', 'l', 'e', 's', '.']
  3. \w: 단어 문자 (알파벳, 숫자, 밑줄)

    import re
    text = "Hello_world123"
    matches = re.findall(r'\w', text)
    print(matches)  # ['H', 'e', 'l', 'l', 'o', '_', 'w', 'o', 'r', 'l', 'd', '1', '2', '3']
  4. \W: 단어 문자가 아닌 문자

    import re
    text = "Hello, world!"
    matches = re.findall(r'\W', text)
    print(matches)  # [',', ' ', '!']
  5. \s: 공백 문자 (스페이스, 탭, 줄바꿈)

    import re
    text = "Hello world\n"
    matches = re.findall(r'\s', text)
    print(matches)  # [' ', '\n']
  6. \S: 공백 문자가 아닌 문자

    import re
    text = "Hello world\n"
    matches = re.findall(r'\S', text)
    print(matches)  # ['H', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd']

반복

  1. *: 0회 이상 반복

    import re
    text = "abbbb ac"
    matches = re.findall(r'ab*', text)
    print(matches)  # ['abbbb', 'a']
  2. +: 1회 이상 반복

    import re
    text = "abbbb ac"
    matches = re.findall(r'ab+', text)
    print(matches)  # ['abbbb']
  3. ?: 0회 또는 1회

    import re
    text = "ab ac"
    matches = re.findall(r'ab?', text)
    print(matches)  # ['ab', 'a']
  4. {n}: 정확히 n회 반복

    import re
    text = "123 4567 89"
    matches = re.findall(r'\d{3}', text)
    print(matches)  # ['123', '456']
  5. {n,}: n회 이상 반복

    import re
    text = "123 4567 89"
    matches = re.findall(r'\d{2,}', text)
    print(matches)  # ['123', '4567', '89']
  6. {n,m}: n회 이상 m회 이하 반복

    import re
    text = "123 4567 89"
    matches = re.findall(r'\d{2,3}', text)
    print(matches)  # ['123', '45', '67', '89']

기타

  1. .: 임의의 한 문자 (줄바꿈 제외)

    import re
    text = "a1 b2 c3"
    matches = re.findall(r'a.', text)
    print(matches)  # ['a1']
  2. ^: 문자열의 시작

    import re
    text = "start middle end"
    matches = re.findall(r'^start', text)
    print(matches)  # ['start']
  3. $: 문자열의 끝

    import re
    text = "start middle end"
    matches = re.findall(r'end$', text)
    print(matches)  # ['end']
  4. []: 문자 집합 (예: [a-z]는 소문자 알파벳)

    import re
    text = "abc 123"
    matches = re.findall(r'[a-c]', text)
    print(matches)  # ['a', 'b', 'c']
  5. |: OR 연산자 (예: a|b는 'a' 또는 'b')

    import re
    text = "abc def"
    matches = re.findall(r'a|d', text)
    print(matches)  # ['a', 'd']
  6. (): 그룹화 (예: (abc)는 'abc'를 하나의 그룹으로 취급)

    import re
    text = "abc def"
    matches = re.findall(r'(abc)', text)
    print(matches)  # ['abc']

3. 예시코드 및 활용코드

1. 숫자 찾기 (\d+)

import re
text = "There are 123 apples and 456 oranges."
matches = re.findall(r'\d+', text)
print(matches)  # ['123', '456']
  • \d+:
    • \d는 숫자를 의미합니다.
    • +는 하나 이상의 연속된 숫자를 찾습니다.
    • 따라서, 이 패턴은 문자열에서 하나 이상의 연속된 숫자를 모두 찾습니다.

2. 이메일 주소 찾기

import re
text = "Contact us at support@example.com or sales@example.org."
pattern = r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}'
matches = re.findall(pattern, text)
print(matches)  # ['support@example.com', 'sales@example.org']
  • [a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}:
    • [a-zA-Z0-9._%+-]+: 알파벳 대소문자, 숫자, 점(.), 밑줄(_), 퍼센트(%), 더하기(+), 빼기(-) 중 하나 이상의 문자.
    • @: ‘@’ 문자.
    • [a-zA-Z0-9.-]+: 알파벳 대소문자, 숫자, 점(.), 빼기(-) 중 하나 이상의 문자.
    • \.: 점(.) 문자.
    • [a-zA-Z]{2,}: 알파벳 대소문자 중 2개 이상의 문자.
    • 이 패턴은 이메일 주소 형식을 찾습니다.

3. URL 찾기

import re
text = "Visit our website at https://www.example.com or http://example.org."
pattern = r'https?://[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}'
matches = re.findall(pattern, text)
print(matches)  # ['https://www.example.com', 'http://example.org']
  • https?://[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}:
    • https?: ‘http’ 또는 ‘https’ (s는 선택적).
    • ://: ‘://’ 문자.
    • [a-zA-Z0-9.-]+: 알파벳 대소문자, 숫자, 점(.), 빼기(-) 중 하나 이상의 문자.
    • \.: 점(.) 문자.
    • [a-zA-Z]{2,}: 알파벳 대소문자 중 2개 이상의 문자.
    • 이 패턴은 URL 형식을 찾습니다.

4. 전화번호 찾기

import re
text = "Call me at 123-456-7890 or 987-654-3210."
pattern = r'\d{3}-\d{3}-\d{4}'
matches = re.findall(pattern, text)
print(matches)  # ['123-456-7890', '987-654-3210']
  • \d{3}-\d{3}-\d{4}:
    • \d{3}: 3개의 숫자.
    • -: ‘-’ 문자.
    • \d{3}: 3개의 숫자.
    • -: ‘-’ 문자.
    • \d{4}: 4개의 숫자.
    • 이 패턴은 전화번호 형식을 찾습니다.

5. 단어 찾기 (\b\w+\b)

import re
text = "This is a simple sentence."
matches = re.findall(r'\b\w+\b', text)
print(matches)  # ['This', 'is', 'a', 'simple', 'sentence']
  • \b\w+\b:
    • \b: 단어 경계.
    • \w+: 하나 이상의 단어 문자 (알파벳, 숫자, 밑줄).
    • \b: 단어 경계.
    • 이 패턴은 단어를 찾습니다.

6. 특정 문자로 시작하는 문자열 찾기 (^)

import re
text = "Hello world\nPython is fun"
matches = re.findall(r'^Hello', text, re.MULTILINE)
print(matches)  # ['Hello']
  • ^Hello:
    • ^: 문자열의 시작.
    • Hello: ‘Hello’ 문자.
    • 이 패턴은 문자열의 시작 부분에서 'Hello’를 찾습니다.

7. 특정 문자로 끝나는 문자열 찾기 ($)

import re
text = "Hello world\nPython is fun"
matches = re.findall(r'fun$', text, re.MULTILINE)
print(matches)  # ['fun']
  • fun$:
    • fun: ‘fun’ 문자.
    • $: 문자열의 끝.
    • 이 패턴은 문자열의 끝 부분에서 'fun’을 찾습니다.

8. 공백 문자 찾기 (\s+)

import re
text = "This is a test."
matches = re.findall(r'\s+', text)
print(matches)  # [' ', ' ', ' ']
  • \s+:
    • \s: 공백 문자 (스페이스, 탭, 줄바꿈).
    • +: 하나 이상의 연속된 공백 문자.
    • 이 패턴은 하나 이상의 연속된 공백 문자를 찾습니다.

9. 대소문자 구분 없이 찾기 (re.IGNORECASE)

import re
text = "Python is fun. python is powerful."
matches = re.findall(r'python', text, re.IGNORECASE)
print(matches)  # ['Python', 'python']
  • python:
    • python: ‘python’ 문자.
    • re.IGNORECASE: 대소문자 구분 없이 검색.
    • 이 패턴은 대소문자 구분 없이 'python’을 찾습니다.

10. 그룹화 (())

import re
text = "My phone number is 123-456-7890."
pattern = r'(\d{3})-(\d{3})-(\d{4})'
matches = re.findall(pattern, text)
print(matches)  # [('123', '456', '7890')]
  • (\d{3})-(\d{3})-(\d{4}):
    • (\d{3}): 3개의 숫자를 그룹화.
    • -: ‘-’ 문자.
    • (\d{3}): 3개의 숫자를 그룹화.
    • -: ‘-’ 문자.
    • (\d{4}): 4개의 숫자를 그룹화.
    • 이 패턴은 전화번호 형식을 찾고, 각 부분을 그룹화하여 반환합니다.