본문 바로가기
C.W.K.
Stream
Lesson 07 of 12 · published

Markdown 패턴

~10 min · markdown, rewriting

Level 0패턴 호기심
0 XP0/90 lessons0/15 achievements
0/100 XP to next level100 XP to go0% complete

Markdown의 일부 모양은 정규식으로 다루기 쉬워

굵게, 기울임, 인라인 코드, 단순 링크처럼 경계가 짧고 분명한 조각은 정규식으로 찾을 수 있어. 하지만 목록, 인용문, 코드 펜스, 중첩 구문은 줄 사이의 상태까지 봐야 해서 전용 파서의 영역이야.

굵게와 기울임은 처리 순서가 중요해

굵게:   \*\*([^*]+)\*\*
기울임: \*([^*]+)\*

별표 두 개를 쓰는 굵게 구문을 먼저 찾지 않으면 기울임 패턴이 그 일부를 잘못 소비할 수 있어.

인라인 코드의 단순한 형태

`([^`]+)`

이 패턴은 백틱 한 쌍 사이에 백틱이 없는 경우만 처리해. 백틱 자체를 포함하려고 더 긴 백틱 경계를 쓰는 실제 Markdown 규칙까지 다루려면 별도 처리가 필요해.

링크와 이미지는 앞의 느낌표로 갈려

\[([^\]]+)\]\(([^)]+)\)

그룹 1은 링크 글자, 그룹 2는 URL을 담아. 중첩 대괄호나 괄호는 처리하지 못하고, ![alt](url)에서도 링크 부분을 잡을 수 있어. 링크만 원한다면 지원 엔진에서 (?<!!)로 앞의 !를 막고, 둘 다 원한다면 !?를 함께 캡처해 종류를 구분해.

제목은 줄 경계와 함께 찾아

^(#{1,6})\s+(.+?)\s*$를 여러 줄 모드로 사용하면 그룹 1의 # 개수로 단계가 정해지고 그룹 2에 제목 글자가 들어가.

문서 전체를 해석한다면 파서를 써

HTML 변환이나 중첩 목록 처리처럼 Markdown 문법 전체가 필요하면 Python의 markdown·mistune, JavaScript의 marked, Rust의 pulldown-cmark 같은 파서를 선택해. 정규식은 범위가 분명한 일회성 수정에 남겨 두는 게 좋아.

Code

Markdown 재작성·python
import re

text = '''# Title
This is **bold** and *italic* and `code`.
See [the docs](https://example.com).'''

# Bold 를 HTML 로
text = re.sub(r'\*\*([^*]+)\*\*', r'<strong>\1</strong>', text)

# Italic — 주의: bold 치환 뒤에 실행해야 bold 일부를 다시 잡지 않아
text = re.sub(r'(?<!\*)\*([^*]+)\*(?!\*)', r'<em>\1</em>', text)

# Inline 코드
text = re.sub(r'`([^`]+)`', r'<code>\1</code>', text)

# 링크
text = re.sub(r'\[([^\]]+)\]\(([^)]+)\)', r'<a href="\2">\1</a>', text)

# Heading (멀티라인)
def heading(m):
    level = len(m.group(1))
    return f'<h{level}>{m.group(2)}</h{level}>'

text = re.sub(r'^(#{1,6})\s+(.+?)\s*$', heading, text, flags=re.MULTILINE)

print(text)
# <h1>Title</h1>
# This is <strong>bold</strong> and <em>italic</em> and <code>code</code>.
# See <a href="https://example.com">the docs</a>.

External links

Exercise

Markdown 파일에서 [text](url) 형태의 링크를 찾아 링크 글자와 URL을 두 열로 출력하는 패턴을 작성해. 실제 문서 복사본에 실행하고 중첩 괄호나 이미지처럼 처리하지 못한 구문도 함께 기록해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.