TITEDIOS 편한 코딩

Python 기초강의: #21 정규 표현식(1) - 기본 문법 본문

파이썬

Python 기초강의: #21 정규 표현식(1) - 기본 문법

TitediosKW 2024. 7. 13. 19:00
반응형


정규 표현식(Regular Expression)은 문자열에서 특정 패턴을 찾거나, 치환하거나, 추출하는 데 사용하는 강력한 도구입니다. 파이썬에서는 re 모듈을 사용하여 정규 표현식을 처리할 수 있습니다. 이 포스팅에서는 정규 표현식의 기본 문법과 파이썬에서 이를 사용하는 방법을 자세히 알아보겠습니다.

정규 표현식은 좀 어려울 수 있습니다. 사실 '기초 강의'라는 이름을 붙이기 망설여지는데요 ㅎㅎㅎ. 기존 강의 포스팅과의 통일성을 위해 기초강의라고 하겠습니다. 정규 표현식을 잘 익혀 두시면 정말 유용한 기능들을 간단한 문장으로 구현이 가능합니다. 따라서, 여러분도 이해가 가지 않는다면 가지 않는데로 가면 가는데로 익혀두시면 좋겠습니다. 익혀두시고 필요하실 때마다 정규표현식 활용을 확인해보시면 되겠습니다.

그럼 시작하겠습니다.

1. 정규 표현식의 기본 개념

정규 표현식은 문자열에서 특정 패턴을 찾기 위한 표현식입니다. 예를 들어, 이메일 주소, 전화번호, 우편번호 등과 같은 특정 형식을 갖는 문자열을 찾는 데 유용합니다.

2. re 모듈

파이썬에서 정규 표현식을 사용하려면 re 모듈을 임포트해야 합니다.

import re

3. 정규 표현식의 기본 문법

리터럴 문자

리터럴 문자는 일반 텍스트와 일치합니다. 예를 들어, 정규 표현식 cat은 문자열 "cat"과 일치합니다.

pattern = r"cat"
text = "I have a cat."
match = re.search(pattern, text)
print(match.group())  # 출력: cat

메타문자

메타문자는 특별한 의미를 갖는 문자입니다. 대표적인 메타문자에는 . ^ $ * + ? { } [ ] \ | ( ) 등이 있습니다.

  • . - 임의의 단일 문자와 일치합니다.
  • ^ - 문자열의 시작과 일치합니다.
  • $ - 문자열의 끝과 일치합니다.
  • * - 앞의 문자나 그룹이 0번 이상 반복됨을 의미합니다.
  • + - 앞의 문자나 그룹이 1번 이상 반복됨을 의미합니다.
  • ? - 앞의 문자나 그룹이 0번 또는 1번 나타남을 의미합니다.
  • {m,n} - 앞의 문자나 그룹이 m번 이상, n번 이하 반복됨을 의미합니다.
  • [] - 대괄호 안의 문자 중 하나와 일치합니다.
  • | - OR 연산자입니다.
  • () - 그룹을 만듭니다.

예제

지금부터는 몇 가지 예제를 살펴보겠습니다. 조금 양이 많습니다. 하나하나 살펴보시면 좋겠지만 그럴 수 없다면 필요할 때마다 확인하시면서 익혀가시면 좋겠습니다.

임의의 문자와 일치 (.)

pattern = r"c.t"
text = "cat cot cut"
matches = re.findall(pattern, text)
print(matches)  # 출력: ['cat', 'cot', 'cut']

문자열의 시작과 일치 (^)

pattern = r"^Hello"
text = "Hello, World!"
match = re.search(pattern, text)
print(match.group())  # 출력: Hello

문자열의 끝과 일치 ($)

pattern = r"World!$"
text = "Hello, World!"
match = re.search(pattern, text)
print(match.group())  # 출력: World!

0번 이상 반복 (*)

pattern = r"ca*t"
text = "ct cat caat caaat"
matches = re.findall(pattern, text)
print(matches)  # 출력: ['ct', 'cat', 'caat', 'caaat']

1번 이상 반복 (+)

pattern = r"ca+t"
text = "ct cat caat caaat"
matches = re.findall(pattern, text)
print(matches)  # 출력: ['cat', 'caat', 'caaat']

0번 또는 1번 나타남 (?)

pattern = r"ca?t"
text = "ct cat caat caaat"
matches = re.findall(pattern, text)
print(matches)  # 출력: ['ct', 'cat']

반복 횟수 지정 ({m,n})

pattern = r"ca{2,3}t"
text = "cat caat caaat caaaat"
matches = re.findall(pattern, text)
print(matches)  # 출력: ['caat', 'caaat']

문자 클래스 ([])

pattern = r"[cb]at"
text = "cat bat hat"
matches = re.findall(pattern, text)
print(matches)  # 출력: ['cat', 'bat']

OR 연산자 (|)

pattern = r"cat|dog"
text = "I have a cat and a dog."
matches = re.findall(pattern, text)
print(matches)  # 출력: ['cat', 'dog']

그룹 (())

pattern = r"(cat|dog)"
text = "I have a cat and a dog."
matches = re.findall(pattern, text)
print(matches)  # 출력: ['cat', 'dog']

4. 자주 사용하는 함수

re.search

문자열 전체를 검색하여 첫 번째 매치를 반환합니다.

pattern = r"\d+"
text = "My number is 12345."
match = re.search(pattern, text)
if match:
    print(match.group())  # 출력: 12345

re.findall

일치하는 모든 패턴을 리스트로 반환합니다.

pattern = r"\d+"
text = "I have 2 cats and 3 dogs."
matches = re.findall(pattern, text)
print(matches)  # 출력: ['2', '3']

re.match

문자열의 시작에서 매치를 찾습니다.

pattern = r"Hello"
text = "Hello, World!"
match = re.match(pattern, text)
if match:
    print(match.group())  # 출력: Hello

re.sub

일치하는 패턴을 치환합니다.

pattern = r"dog"
text = "I have a dog."
new_text = re.sub(pattern, "cat", text)
print(new_text)  # 출력: I have a cat.

re.split

패턴을 기준으로 문자열을 분할합니다.

pattern = r"\s+"
text = "Split this sentence into words."
words = re.split(pattern, text)
print(words)  # 출력: ['Split', 'this', 'sentence', 'into', 'words.']

결론

파이썬의 정규 표현식은 문자열을 처리할 때 매우 강력하고 유연한 도구입니다. 기본 문법과 re 모듈의 주요 함수들을 잘 활용하면 다양한 문자열 처리 작업을 효율적으로 수행할 수 있습니다. 이 포스팅에서 다룬 내용을 바탕으로 정규 표현식을 사용해 보세요. 더욱 복잡한 패턴을 다루기 위해서는 정규 표현식의 고급 문법과 다양한 예제를 추가로 학습하는 것이 좋습니다.

이번 포스팅에서는 예제를 많이 보여드렸습니다. 정규표현식이라는 것 자체가 여러 예제를 통해 익혀가는게 제일 좋기 때문에 그렇습니다. 다만, 앞서 말씀드렸던 것처럼 한번에 모두를 이해하고 암기하는 것 보다 여러 예제를 반복하여 익숙해지도록 연습하시는 것이 제일 좋습니다. 참고로 정규표현식을 이용해 작업을 간단하게 처리하면 뭔가 짜릿한 느낌을 받으실 수 있습니다(혹시.. 저만그런가요?ㅎㅎ).

감사합니다!

반응형