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

정규 표현식(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) |
hy | hy 라는 문자열과 정확히 일치 |
\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|elice
→alice
또는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
,abbb
등b
가 0개 이상 포함된 모든 경우와 매칭.ab+
→ab
,abb
,abbb
등b
가 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과 함께 사용)
grep
과 cut
을 함께 사용하면 특정 컬럼만 출력 가능하다.
grep "error" log.txt | cut -d ' ' -f 2
➡ log.txt
에서 "error"
가 포함된 행 중 두 번째 단어만 출력.
6. 결과 강조 (색상)
기본적으로 grep
은 검색 결과를 색상으로 강조하지 않지만, --color
옵션을 사용하면 색상을 적용할 수 있다.
grep --color=auto "error" log.txt
➡ "error"
부분이 색상으로 강조되어 출력됨.
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).