[이어드림스쿨 1주차] 정규 표현식과 grep

KiwiChipKiwiChip
7 min read

정규 표현식(Regular Expressions) 기초 정리

1. 정규 표현식이란?

정규 표현식(Regular Expressions, RegEx)은 특정한 규칙을 가진 문자열 집합을 표현하는 데 사용하는 패턴이다. 이를 활용하면 문자열 검색, 추출, 치환 등의 작업을 효과적으로 수행할 수 있다.

정규 표현식은 특정 문제를 해결하기 위한 논리적 규칙을 포함하며, 일반적인 문자와 특수한 의미를 갖는 기호(메타 문자)로 구성된다.


2. 정규식 메타 문자(Meta Characters)

메타 문자는 정규 표현식에서 특정한 의미를 가지는 특수 기호를 뜻한다.

(1) 주요 메타 문자 및 의미

메타 문자의미
^문자열의 시작
$문자열의 끝
.하나의 문자와 대응 (줄바꿈 제외)
\b단어의 경계를 의미 (word boundary)
\s공백 문자 (space, tab, newline 포함)
\S공백 문자가 아닌 것
\d숫자 (0-9)
\D숫자가 아닌 것
\w알파벳 대소문자, 숫자, 언더스코어(_)
\W\w에 해당하지 않는 문자 (특수 문자 포함)
\n개행 문자 (newline)
\t탭(tab) 문자
\메타 문자를 일반 문자로 해석

예를 들어 \..을 특수 기호가 아니라 그냥 마침표로 해석하도록 한다.

예제

\bhy\w+ 를 분석해보자.

1. 각 요소의 의미

정규식 요소의미
\b단어의 경계를 의미 (word boundary)
hyhy라는 문자열과 정확히 일치
\w+하나 이상의 문자(\w는 알파벳, 숫자, _ 포함)

2. 패턴 해석

  • \b단어의 시작을 지정한다. 즉, hy가 단어의 시작 부분에 있어야 한다.

  • hy → 반드시 "hy"로 시작하는 단어를 찾다.

  • \w+hy 다음에 알파벳, 숫자, 언더스코어(_)로 이루어진 문자열이 하나 이상 와야 한다.

즉, 단어 경계를 기준으로 hy로 시작하는 단어를 찾는 패턴이다.


3. 예제

✅ 매칭되는 문자열:

문자열매칭된 부분
"hyphen""hyphen"
"hyderabad""hyderabad"
"hy123""hy123"

❌ 매칭되지 않는 문자열:

문자열이유
"ahybrid""hy" 앞에 문자가 있어 단어 경계(\b)가 성립하지 않음
"hello hythere""hythere"hy로 시작하지만, 앞에 공백이 있지만 \b가 단어 경계이므로 hy 다음의 t까지 포함하는 단어여야 함

3. 선택 패턴

  • |(OR 연산자)
    A|B 패턴을 사용하면 A 또는 B 중 하나와 매칭된다.
    예: alice|elicealice 또는 elice와 매칭됨.

  • [](문자 집합)
    [] 대괄호 안에 있는 문자 중 하나와 매칭된다.
    예:

    • [a,b,c]a, b, c 중 하나와 매칭

    • [0-9]0부터 9까지의 숫자 중 하나와 매칭

    • [A-Z]A부터 Z까지의 대문자 중 하나와 매칭

    • [a-zA-Z] → 알파벳 대소문자 중 하나와 매칭

  • [^](not 연산자)
    [] 내에서 ^ 기호를 사용하면 "해당 문자들을 제외한 나머지"를 의미한다.
    예:

    • [^0-9] → 숫자가 아닌 문자와 매칭됨.

4. 수량 한정자(Quantifiers)

메타 문자를 조합하여 특정 개수의 문자를 지정할 수 있다.

수량 한정자의미
?0개 또는 1개 (있어도 되고 없어도 됨)
*0개 이상 (없거나, 여러 개 있을 수 있음)
+1개 이상 (최소 1개 필요)
{n}정확히 n
{n,m}n개 이상 m개 이하
{n,}n개 이상

예제:

  • apples?apple 또는 apples 매칭됨 (s가 있을 수도, 없을 수도 있음, 앞의 문자열이 존재해도, 존재하지 않아도 무관함).

  • ab*a, ab, abb, abbbb가 0개 이상 포함된 모든 경우와 매칭.

  • ab+ab, abb, abbbb가 1개 이상 포함된 경우와 매칭 (a 단독은 매칭되지 않음).

  • a{2}aa와 정확히 매칭됨.

  • a{2,3}aa 또는 aaa와 매칭됨.

  • a{2,}aa, aaa, aaaa 등 2개 이상 연속된 a와 매칭됨.


5. 그룹 패턴(Grouping Patterns)

그룹을 만들면 특정 부분을 묶어서 하나의 단위로 활용할 수 있다.

  • ()(그룹 생성)
    (표현식)을 사용하면 그룹으로 묶을 수 있으며, 정규식 내에서 재사용 가능하다.

  • \1, \2, \3 등 그룹 참조
    정규식 내에서 그룹으로 묶은 부분을 뒤에서 다시 참조할 수 있다.
    예제:

    • (to)ma\1'tomato'와 매칭됨 (\1이 첫 번째 그룹 (to)를 참조).

6. 정규 표현식 사용 예제

(1) 전화번호 패턴

^010(\D?\d{4}){2}$

  • ^010 → 전화번호는 010으로 시작해야 함.

  • (\D?\d{4}){2} → 숫자 4개(\d{4})가 두 번 반복됨, 앞에 구분 문자(\D?)가 있을 수도 있음.

  • $ → 문자열 끝을 의미.

즉, 010-1234-5678, 01012345678 같은 전화번호 패턴과 매칭된다.


7. 정규 표현식 활용 예제

(1) 이메일 주소 검사

^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
  • ^[a-zA-Z0-9._%+-]+ → 이메일 아이디 부분

  • @@ 기호 포함

  • [a-zA-Z0-9.-]+ → 도메인 부분 (example.com)

  • \.[a-zA-Z]{2,}$ → 최상위 도메인 (.com, .org 등)

(2) 비밀번호 검사 (최소 8자, 하나 이상의 숫자 포함)

^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,}$
  • (?=.*[A-Za-z]) → 최소 하나 이상의 알파벳 포함

  • (?=.*\d) → 최소 하나 이상의 숫자 포함

  • [A-Za-z\d]{8,} → 최소 8자 이상

(3) HTML 태그 제거

<[^>]*>
  • <로 시작하고 >로 끝나는 모든 HTML 태그를 찾아 제거

8. 정리

정규 표현식은 문자열 패턴을 검색하고 처리하는 데 강력한 도구이다. 기본적인 메타 문자와 수량 한정자를 이해하면 검색, 추출, 치환 등의 작업을 효율적으로 수행할 수 있다. 다양한 활용 예제를 실습하며 익히는 것이 중요하다.

Python, JavaScript, Java 등 대부분의 프로그래밍 언어에서 정규 표현식을 지원하며, re 라이브러리를 활용하여 정규식을 사용할 수 있다.

예제(Python):

import re

pattern = r"\d+"
text = "오늘 날짜는 2025년 3월 21일입니다."
match = re.findall(pattern, text)
print(match)  # ['2025', '3', '21']

grep

grep은 리눅스 명령어 중 하나로, 파일 내에서 특정 패턴이나 문자열을 검색하고, 이를 포함하는 모든 행을 출력하는 명령어이다.

1. 기본 사용법

grep [옵션] [검색 패턴] [파일명]

예제:

grep elice hello.txt

hello.txt 파일에서 "elice"가 포함된 모든 행을 출력.


2. 주요 옵션

옵션의미예시
-i대소문자 구분 없이 검색grep -i "apple" fruits.txt (Apple, APPLE도 매칭됨)
-v패턴과 일치하지 않는 행을 출력 (반전 검색)grep -v "error" log.txt (error가 없는 행 출력)
-c패턴과 일치하는 행의 개수를 출력grep -c "hello" file.txt (hello가 포함된 행 개수 출력)
-w단어 단위로 정확히 매칭되는 경우만 출력grep -w "cat" animals.txt (category는 매칭되지 않음)

✅ 옵션 예제

grep -c elice hello.txt

hello.txt 파일에서 "elice"가 포함된 행의 개수를 출력.

grep -v a file.txt

file.txt에서 a가 포함되지 않은 모든 행을 출력.


3. 정규 표현식과 함께 사용

grep은 정규 표현식을 활용하여 더욱 강력한 검색을 수행할 수 있다.

정규 표현식의미예시
[0-9]숫자 한 개 검색grep "[0-9]" hello.txt (숫자가 포함된 행 찾기)
^행의 시작grep "^hello" file.txt (hello로 시작하는 행 찾기)
$행의 끝grep "done$" script.log (done으로 끝나는 행 찾기)
.임의의 문자 한 개grep "a.c" words.txt (abc, aac, axc 등 매칭)
*앞 문자가 0개 이상 반복grep "go*d" file.txt (gd, god, good, goood 등 매칭)
\특수문자 검색 시 사용grep "Elice\.The\.Rabbit" * (현재 디렉토리 모든 파일에서 "Elice.The.Rabbit" 찾기)

✅ 예제

grep "Elice\.The\.Rabbit" *

➡ 현재 디렉토리의 모든 파일에서 "Elice.The.Rabbit"이 포함된 행을 출력.

grep "^[0-9]" data.txt

data.txt 파일에서 숫자로 시작하는 행을 찾기.

grep -v "^#" somecode

somecode 파일에서 #으로 시작하지 않는 모든 행을 출력.

grep '\<[a-z].*e\>' elice

elice 파일에서 소문자로 시작하고, 공백을 포함한 여러 문자가 나오며, e로 끝나는 단어가 포함된 행을 출력.


4. 여러 파일에서 검색

여러 파일에서 특정 문자열을 찾고 싶다면 *을 활용할 수 있다.

grep "error" *.log

➡ 현재 디렉토리의 모든 .log 파일에서 "error"가 포함된 행을 출력.

grep -r "TODO" .

현재 디렉토리(.) 내의 모든 파일에서 "TODO"가 포함된 행을 재귀적으로 검색.


5. 특정 컬럼만 출력하기 (cut과 함께 사용)

grepcut을 함께 사용하면 특정 컬럼만 출력 가능하다.

grep "error" log.txt | cut -d ' ' -f 2

log.txt에서 "error"가 포함된 행 중 두 번째 단어만 출력.


6. 결과 강조 (색상)

기본적으로 grep은 검색 결과를 색상으로 강조하지 않지만, --color 옵션을 사용하면 색상을 적용할 수 있다.

grep --color=auto "error" log.txt

"error" 부분이 색상으로 강조되어 출력됨.


0
Subscribe to my newsletter

Read articles from KiwiChip directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

KiwiChip
KiwiChip

I'm currently learning Python and studying RAG (Retrieval-Augmented Generation).