실무 활용 프로젝트
이번 챕터에서는 정규표현식을 실무에서 어떻게 활용하는지 두 가지 프로젝트를 통해 알아보겠습니다. 직접 코드를 작성해보고, 다음 챕터에서 해답을 확인해보세요.
1. 마크다운 파서 만들기
1.1 프로젝트 개요
마크다운 문서에서 제목, 링크, 강조 구문을 추출하고 HTML로 변환하는 간단한 파서를 만듭니다. 마크다운은 개발자들이 문서를 작성할 때 자주 사용하는 형식으로, 정규표현식을 활용하면 효율적으로 파싱할 수 있습니다.
1.1.1 요구사항
| 변환 대상 | 마크다운 형식 | HTML 결과 |
|---|---|---|
| 헤더 | # 제목 ~ ###### 제목 | <h1>제목</h1> ~ <h6>제목</h6> |
| 링크 | [텍스트](URL) | <a href="URL">텍스트</a> |
| 굵게 | **텍스트** | <strong>텍스트</strong> |
| 기울임 | *텍스트* | <em>텍스트</em> |
1.1.2 테스트용 입력 텍스트
# 메인 제목
## 부제목
이것은 [위니브](https://weniv.co.kr) 튜토리얼입니다.
**중요한** 내용과 *강조할* 내용이 있습니다.
### 세부 내용
추가 설명은 [여기](https://example.com)를 참고하세요.
힌트
- 헤더 패턴:
^(#{1,6})\s+(.+)$-#의 개수로 헤더 레벨을 결정 - 링크 패턴:
\[([^\]]+)\]\(([^)]+)\)- 대괄호와 소괄호 안의 내용 추출 - 굵게와 기울임은 순서가 중요합니다 (굵게를 먼저 처리해야 함)
2. 로그 파일 분석기
2.1 프로젝트 개요
웹 서버 로그 파일을 분석하여 주요 통계 정보를 추출하는 프로그램을 만듭니다. 로그 분석은 서버 운영, 보안 모니터링, 사용자 행동 분석 등에 필수적인 작업입니다.
2.1.1 요구사항
- IP 주소별 접속 횟수 카운트
- 시간대별 접속 통계
- 가장 많이 접속한 서비스 TOP 5
2.1.2 테스트용 로그 데이터
32.154.21.89 - - [29/Nov/2024:08:15:43 +0900] "GET /login HTTP/1.1" 200 4521 "https://sql.weniv.co.kr/main" "Mozilla/5.0"
187.234.121.55 - - [29/Nov/2024:08:16:12 +0900] "GET /course/python HTTP/1.1" 200 3267 "https://books.weniv.co.kr/" "Mozilla/5.0"
91.45.234.178 - - [29/Nov/2024:08:17:01 +0900] "POST /shorten HTTP/1.1" 201 342 "https://weniv.link/" "Chrome/120.0.0.0"
156.78.90.234 - - [29/Nov/2024:08:18:23 +0900] "GET /schedule HTTP/1.1" 200 2891 "https://time.weniv.co.kr/" "Safari/605.1.15"
211.89.145.67 - - [29/Nov/2024:08:19:45 +0900] "GET / HTTP/1.1" 200 1523 "https://weniv.co.kr" "Firefox/121.0"
167.89.234.90 - - [29/Nov/2024:08:20:11 +0900] "GET /dashboard HTTP/1.1" 200 5632 "https://canvas.weniv.co.kr/" "Edge/120.0.0.0"
45.178.234.89 - - [29/Nov/2024:08:21:34 +0900] "POST /query HTTP/1.1" 200 892 "https://sql.weniv.co.kr/editor" "Chrome/120.0.0.0"
123.45.167.89 - - [29/Nov/2024:08:22:56 +0900] "GET /book/python-basics HTTP/1.1" 200 4521 "https://books.weniv.co.kr/" "Firefox/121.0"
234.156.78.90 - - [29/Nov/2024:08:23:12 +0900] "GET /stats HTTP/1.1" 200 2341 "https://weniv.link/dashboard" "Safari/605.1.15"
89.234.156.78 - - [29/Nov/2024:08:24:45 +0900] "GET /calendar/2024 HTTP/1.1" 200 3421 "https://time.weniv.co.kr/" "Chrome/120.0.0.0"
178.90.234.156 - - [29/Nov/2024:08:25:23 +0900] "POST /contact HTTP/1.1" 200 567 "https://weniv.co.kr/about" "Edge/120.0.0.0"
90.234.156.78 - - [29/Nov/2024:08:26:34 +0900] "GET /assignments HTTP/1.1" 200 4532 "https://canvas.weniv.co.kr/" "Firefox/121.0"
145.67.89.234 - - [29/Nov/2024:08:27:56 +0900] "GET /practice HTTP/1.1" 200 3421 "https://sql.weniv.co.kr/learn" "Chrome/120.0.0.0"
67.89.234.156 - - [29/Nov/2024:08:28:12 +0900] "GET /ebook/javascript HTTP/1.1" 200 5632 "https://books.weniv.co.kr/" "Safari/605.1.15"
89.234.156.78 - - [29/Nov/2024:08:29:45 +0900] "POST /shorten/custom HTTP/1.1" 201 445 "https://weniv.link/" "Firefox/121.0"
234.156.78.90 - - [29/Nov/2024:08:30:23 +0900] "GET /reminder HTTP/1.1" 200 2341 "https://time.weniv.co.kr/" "Chrome/120.0.0.0"
156.78.90.234 - - [29/Nov/2024:08:31:34 +0900] "GET /courses HTTP/1.1" 200 6789 "https://weniv.co.kr/learning" "Edge/120.0.0.0"
78.90.234.156 - - [29/Nov/2024:08:32:56 +0900] "POST /submit HTTP/1.1" 200 892 "https://canvas.weniv.co.kr/" "Safari/605.1.15"
90.234.156.78 - - [29/Nov/2024:08:33:12 +0900] "GET /advanced HTTP/1.1" 200 4521 "https://sql.weniv.co.kr/courses" "Firefox/121.0"
234.156.78.90 - - [29/Nov/2024:08:34:45 +0900] "GET /shop HTTP/1.1" 200 3421 "https://books.weniv.co.kr/" "Chrome/120.0.0.0"
로그 형식 분석
각 로그 라인은 다음과 같은 구조를 가지고 있습니다:
- IP 주소:
32.154.21.89- 클라이언트 IP - 타임스탬프:
[29/Nov/2024:08:15:43 +0900]- 접속 시간 - 요청 정보:
"GET /login HTTP/1.1"- HTTP 메서드, 경로, 프로토콜 - 상태 코드:
200- HTTP 응답 상태 - 바이트:
4521- 응답 크기 - 리퍼러:
"https://sql.weniv.co.kr/main"- 이전 페이지 URL - User-Agent:
"Mozilla/5.0"- 브라우저 정보
힌트
- IP 주소 패턴:
\d+\.\d+\.\d+\.\d+ - 타임스탬프에서 시간 추출:
\[(\d+/\w+/\d+:(\d+):\d+:\d+) - 리퍼러에서 서비스 추출:
"(https?://[^"]+)"