티스토리 뷰

728x90
반응형

프로그래밍을 하다 보면 문자열을 배열하고 가공해야 할 일이 자주 생깁니다. 이메일 주소를 추출하거나, 특정 패턴의 로그를 찾거나, 단어를 필터링하는 일까지—이럴 때 **정규 표현식(Regular Expression)**은 강력한 무기가 됩니다.

이 글에서는 정규 표현식의 기본 개념과 자주 사용하는 메타 문자들을 소개하고, 다양한 실전 예제를 통해 어떻게 활용하는지 상세히 살펴보겠습니다.


✅ 정규 표현식이란?

정규 표현식은 특정 문자열 패턴을 찾거나 검사하기 위해 사용하는 표현 방식입니다. 텍스트에서 원하는 형태의 데이터를 빠르게 추출하거나 검증하는 데 사용됩니다.

예를 들어, 아래와 같은 작업이 가능합니다:

  • 이메일 주소인지 확인
  • 핸드폰 번호에서 숫자만 추출
  • 로그 파일에서 특정 시간대의 기록만 찾기
  • 파일 이름에서 확장자 구분하기
  • 문장 안에서 특정 단어 패턴 찾기

🔤 주요 메타 문자(Meta-characters) 정리

1. 문자 단위 매칭

기호 설명 예시

. 아무 문자 하나 a.b → acb, a3b, a_b 등 (단, 줄바꿈 문자는 제외)
^abc 문자열의 시작 ^Hello는 "Hello world"에는 매치되지만, "Say Hello"에는 매치되지 않음
abc$ 문자열의 끝 end$는 "This is the end"에는 매치되지만, "ending soon"에는 매치되지 않음
[abc] a, b, c 중 하나 gr[ae]y는 gray, grey에 모두 매치
[^abc] a, b, c 제외한 하나의 문자 [^0-9]는 숫자를 제외한 모든 문자
[A-Z0-9] 대문자 또는 숫자 ID[A-Z0-9]+는 ID4, IDA123, IDZ에 매치

2. 반복 관련 기호 (Closure)

반복 관련 기호들은 문자가 몇 번 반복되는지를 지정할 수 있게 해주는 중요한 도구입니다. 아래는 각 기호의 의미와 함께 보다 상세한 예시 설명을 포함하고 있습니다.

기호 설명 예시 및 설명

* 0회 이상 반복 패턴 go*gle은 gogle, google, gooogle처럼 o가 0번 이상 반복될 수 있습니다. ggle도 허용됩니다.
+ 1회 이상 반복 패턴 go+gle은 o가 반드시 1번 이상 나와야 하므로 google, gooogle은 매치되지만, ggle은 매치되지 않습니다.
? 0 또는 1회 패턴 colou?r은 u가 있어도 되고 없어도 되므로 color와 colour 모두에 매치됩니다. colouur은 매치되지 않습니다.
{n} 정확히 n번 반복 \d{4}는 정확히 4자리 숫자를 의미하며, 2024, 1999 등 4자리 숫자에만 매치됩니다. 123, 12345는 매치되지 않습니다.
{n,} 최소 n번 반복 a{2,}는 a가 최소 2번 이상 반복되는 경우로, aa, aaa, aaaaa 모두 매치되며, a는 매치되지 않습니다.
{,n} 최대 n번 반복 a{,2}는 a가 최대 2번까지 반복되는 경우로, ``, a, aa는 매치되며 aaa는 매치되지 않습니다.
{m,n} m~n번 반복 \d{2,4}는 숫자가 2~4자리 반복되는 경우로, 12, 123, 1234는 매치되며, 1이나 12345는 매치되지 않습니다.

3. 논리 연산자 및 그룹

이 부분에서는 선택 또는 그룹화된 부분에 대해 패턴을 구성할 수 있습니다.

기호 설명 예시 및 설명

`a b` a 또는 b
(abc) 괄호로 그룹 지정 (ha)+는 ha, hahaha, hahahaha 등에서 ha라는 그룹이 반복되는 구조를 잡을 수 있습니다. 그룹을 지정하면 나중에 재사용도 가능합니다.
`a(b c)+` 그룹 내 선택 반복

4. 문자 클래스 약어

문자 클래스를 편리하게 사용할 수 있도록 미리 정의된 약어입니다. 아래 약어들을 사용하면 코드가 더 짧고 읽기 쉬워집니다.

기호 설명 동등 표현 예시

\d 숫자 [0-9] \d+는 하나 이상의 숫자 (예: 123, 9)
\D 숫자 제외 [^0-9] \D+는 문자나 기호 등 숫자가 아닌 것들 (예: abc!)
\s 공백 문자 [ \t\n\r\f\v] 공백, 탭, 줄바꿈 등에 매치됨 (예: \s+는 여러 공백)
\S 공백 제외 [^ \t\n\r\f\v] 공백이 아닌 모든 문자 (예: 단어, 숫자 등)
\w 단어 문자 (영문자, 숫자, 언더바) [a-zA-Z0-9_] 변수명, 사용자 ID 등에서 자주 사용
\W 단어 문자가 아닌 것 [^a-zA-Z0-9_] 구두점, 기호 등 (예: !, @, #)

💡 실전 예제

1. 이메일 주소 검증

import re
pattern = r"^[\w\.-]+@[\w\.-]+\.\w{2,}$"
tests = ["user@example.com", "my-email@domain.co.kr", "invalid@@test"]
for t in tests:
    print(f"{t}:", bool(re.match(pattern, t)))

2. 전화번호에서 숫자만 추출

text = "전화번호: 010-1234-5678"
re.findall(r"\d+", text)  # ['010', '1234', '5678']

3. 특정 확장자의 파일 찾기

text = "image.jpg, test.GIF, photo.png, doc.txt"
re.findall(r"\b\w+\.(jpg|png|gif)\b", text, re.IGNORECASE)
# ['jpg', 'GIF', 'png']

4. 숫자 4자리 연도 추출

text = "Born in 1995, graduated in 2018."
re.findall(r"\b\d{4}\b", text)  # ['1995', '2018']

5. 괄호 안의 내용 추출

text = "He said (hello) and left."
re.findall(r"\((.*?)\)", text)  # ['hello']

6. 여러 공백 문자 제거 (탭, 줄바꿈 등 포함)

text = "Hello\tWorld\nNew\rLine"
re.sub(r"\s", "", text)  # 'HelloWorldNewLine'

7. URL 추출

text = "Visit https://example.com or http://test.org."
re.findall(r"https?://[\w./-]+", text)
# ['https://example.com', 'http://test.org']

🧠 마무리

정규 표현식은 처음엔 어렵게 느껴질 수 있지만, 기본 개념과 패턴에 익숙해지면 매우 유용한 도구가 됩니다. 위에서 소개한 메타 문자들과 예제들은 실무에서도 자주 쓰이는 것들이니 자주 테스트하며 익혀보세요!

혹시 정규 표현식에 대해 더 궁금한 부분이 있거나, 자주 쓰는 패턴을 공유하고 싶으시다면 댓글로 남겨주세요 😊

728x90
반응형