수학 개념 지도
언어와 계산(Language and computation)

정규 표현식(Regular expression)

문자열의 패턴을 이어 쓰기(연결), 고르기(|), 되풀이(*) 세 가지 연산으로 적는 표기. 정규 표현식으로 적을 수 있는 언어는 유한 오토마톤⁠(finite automaton)⁠이 알아보는 언어와 정확히 같다.

L(rs)=L(r)L(s),L(r∣s)=L(r)∪L(s),L(r∗)=⋃n≥0L(r)nL(rs) = L(r)L(s), \quad L(r|s) = L(r) \cup L(s), \quad L(r^*) = \bigcup_{n \ge 0} L(r)^n
먼저 보면 좋은 개념집합의 연산유한 오토마톤

정규 표현식은 문자열의 모양을 적는 짧은 식입니다. 글자 a는 문자열 a 하나만 뜻하고, 여기에 세 가지 연산을 씁니다. 연결 rs는 r에 맞는 문자열 뒤에 s에 맞는 문자열을 잇고, 선택 r|s는 둘 중 하나에 맞으면 되며, 반복 r*(미국 논리학자 스티븐 클리니의 이름을 따 클리니 스타라 부릅니다)는 r에 맞는 조각을 0번 이상 잇습니다. 식 하나가 뜻하는 것은 문자열들의 집합⁠(set)⁠, 곧 언어이고, 선택은 합집합⁠(union)⁠입니다. 예를 들어 (a|b)*abb는 'a와 b로 된 아무 문자열 뒤에 abb'이니, abb로 끝나는 문자열 전체입니다.

패턴: . 아래 버튼으로 문자열을 만들어 넣어 보세요. a b ⌫ 비우기 입력 의 경로는 입니다.

위는 패턴과 같은 언어를 알아보는 유한 오토마톤입니다. 이중 원이 받아들이는 상태, 노란 원이 입력을 다 읽은 뒤의 상태입니다. 아래는 같은 문자열 열두 개를 이 패턴에 맞춰 본 결과로, 청록 ✓가 일치입니다.

그림 아래의 판정은 두 번 계산합니다. 한 번은 위의 오토마톤⁠(automaton)⁠을 직접 따라가고, 한 번은 브라우저에 들어 있는 정규 표현식 엔진(JavaScript RegExp)에 패턴을 그대로 넘깁니다. 두 판정은 . 우연이 아닙니다. 1950년대 클리니가 보인 정리에 따르면, 정규 표현식으로 적을 수 있는 언어와 유한 오토마톤이 알아보는 언어는 정확히 같습니다. 식에서 기계로 가는 쪽은 조각마다 작은 기계를 만들어 이어 붙이면 되고(뒤에 나오는 켄 톰프슨의 이름을 딴 톰프슨 구성⁠(Thompson's construction)⁠), 기계에서 식으로 가는 쪽은 상태를 하나씩 없애며 화살표에 식을 적어 나가면 됩니다. 오토마톤 그림은 꼭짓점⁠(vertex)⁠이 상태, 변이 글자인 방향 그래프이고, 받아들여지는 문자열은 시작에서 이중 원까지 가는 길입니다.

식을 기계로 바꾸면 처음에는 한 글자에 여러 갈래로 갈 수 있는 비결정적 오토마톤⁠(nondeterministic automaton)⁠이 나옵니다. 이것을 결정적으로 바꾸는 부분집합 구성⁠(subset construction)⁠에서는 '지금 있을 수 있는 상태들의 집합'을 새 상태로 삼으니, 상태 n개짜리 기계가 최대 2n2^n개, 곧 멱집합⁠(power set)⁠의 크기만큼 불어날 수 있습니다. '끝에서 k번째 글자가 a'라는 패턴은 비결정적 오토마톤으로는 상태 k+1개면 되지만, 결정적 오토마톤으로는 상태가 2k2^k개 꼭 필요합니다. 비결정적 기계는 '여기가 끝에서 k번째다'라고 짐작하는 갈래를 하나 내보내면 그만이지만, 결정적 기계는 입력이 어디서 끝날지 모르니 최근 k글자를 모두 기억해야 하고, a와 b로 된 k글자는 2k2^k가지이기 때문입니다. 보기의 마지막 패턴이 k = 2인 경우로, 상태가 22=42^2 = 4개입니다.

정규 표현식이 못 하는 일도 분명합니다. 기억이 유한하니 aⁿbⁿ이나 짝 맞는 괄호처럼 개수를 끝없이 맞춰야 하는 언어는 적을 수 없고(비둘기집 원리⁠, pigeonhole principle⁠), 이런 언어에는 문맥 자유 문법⁠(context-free grammar)⁠이 필요합니다. 촘스키 위계⁠(Chomsky hierarchy)⁠의 가장 안쪽 층입니다. 다만 프로그래밍 언어의 '정규식'은 되참조⁠(backreference)⁠ 같은 기능을 더해서 이론상의 정규 언어⁠(regular language)⁠를 넘어섭니다. \1은 '첫째 괄호가 맞춘 것과 똑같은 문자열'이라는 뜻이라, (a*)b\1은 b 앞뒤의 a 개수가 같은 문자열 aⁿbaⁿ을 알아봅니다. 그 대가로 속도⁠(velocity)⁠를 보장할 수 없습니다. 되참조가 있는 패턴을 맞추는 일은 NP 완전⁠(NP-complete)⁠ 문제여서, 다항 시간⁠(polynomial time)⁠ 방법이 있다면 P = NP가 됩니다.

이어지는 곳. 뒤에 유닉스 운영체제를 함께 만든 미국 프로그래머 켄 톰프슨이 1960년대 말 문서 편집기에 정규 표현식 검색을 넣었고, 그것이 파일에서 패턴에 맞는 줄을 찾아 주는 유닉스 명령 grep으로 이어졌습니다. 오늘날에는 검색, 입력 검증, 컴파일러⁠(compiler)⁠의 낱말 분석에 두루 쓰입니다. 오탈자를 허락하는 검색은 패턴에 딱 맞는 문자열 대신 패턴과의 편집 거리⁠(edit distance)⁠가 작은 문자열을 찾는 문제입니다. 정규 표현식과 짝을 이루는 오토마톤의 화살표에 확률⁠(probability)⁠을 붙이면 마르코프 연쇄⁠(Markov chain)⁠가 되고, 상태를 숨기면 은닉 마르코프 모델⁠(hidden Markov model)⁠이 됩니다.

관련된 시대와 장소벨 연구소

이 개념이 나오는 긴 글

계산 이론 기계가 풀 수 없는 문제 모든 수학 문제를 기계적으로 풀 수 있을까? 러셀의 역설에서 괴델과 튜링까지, 그 질문에 대한 답은 '아니오'였고, 그 증명이 컴퓨터를 낳았다. 계산언어학 말을 세는 기계 문법은 규칙일까, 확률일까? 파니니의 문법에서 촘스키의 위계, 섀넌의 영어 엔트로피, 오늘날의 언어 모델까지. 신경망과 기계 학습 배우는 기계 예를 보여 주면 규칙을 스스로 찾는 기계. 1958년의 퍼셉트론에서 오늘의 심층 신경망까지, 그 밑바닥에는 미분과 연쇄법칙이 있다. 게임과 증명 이기는 쪽이 존재한다 "이 판은 백이 이겼다"는 흑이 어떻게 두든 백에게 답이 있다는 말이다. 체스의 체르멜로 정리, ε–δ, 님의 이진법, 폰 노이만의 최소최대와 쌍대성, 논리의 한계를 재는 게임, 끝나지 않는 게임과 선택공리, 대화로 읽는 증명, 겨루며 배우는 신경망까지. 수학의 참을 두 사람의 게임으로 읽는다. 반환과 동적 계획법 같은 계산, 다른 덧셈 가장 짧은 길, 길의 가짓수, 가장 그럴듯한 해석, 갈 수 있는지 없는지. 따로 태어난 알고리즘들이 사실은 한 계산이고, 달라지는 것은 더하기와 곱하기 자리에 무엇을 넣느냐뿐이다. 그렇게 바꿔 넣어도 되는 까닭은 분배법칙 하나다. 범주론 화살표만으로 본 수학 최대공약수와 교집합과 '그리고'는 같은 것이고, 화살표를 뒤집으면 최소공배수와 합집합과 '또는'이 된다. 무엇으로 만들었는지 묻지 않고 어떻게 이어지는지만 보는 언어로, '자연스럽다'는 말의 뜻, 관계만으로 대상을 알아보는 요네다의 생각, 함자로 본 연쇄법칙, 어디에나 있는 수반까지 사이트의 여러 분야를 가로지른다.

이 개념을 언급하는 페이지

이 페이지가 가리키는 개념