정규 표현식

SangHyun-Park·2022년 2월 21일
0


개인 연구를 진행하면서 간간히 나를 괴롭히던 정규 표현식이 또 나를 찾아왔다...😁👍

매번 cheat sheet 를 들여다 보고 있자니 한번은 정리하자 싶어서 이번 기회에 정리하려고 한다.

정규 표현식

학부 과정 중 "오토마타와 형식언어" 를 수강하면서 처음 접한 정규 표현. 물론 오토마타에서 사용했던 정규표현식은 아주 미세하게 달랐지만 깊게 안배워서 그런걸수도 만들어진 배경은 아마 일맥 상통할 것이라 믿어 의심치 않는다. 정규언어를 포함하는 문맥자유 언어는 실제로 프로그래밍 언어의 근간이 되는 개념이기도 한다.

기본적으로 기계는 데이터를 처리함에 있어 주어진 Input 에 대한 적절한 Ouput 을 뱉어내는 시스템이다. 따라서 다양한 Input 형식(정확히 이야기하면 약속된 알파벳 Σ 으로 표현가능한 어떤 형태든) 에 대해서 미리 대응할 수 있어야하고, 처리할 형태에 대해서 약속을 해놓은 것이 정규 표현식이 되겠다.

쉽게 말하자면 입력값으로 받는 문자열의 특징과 패턴을 매칭시키기 위해 정규 표현식을 사용한다.

이번 연구를 진행하면서 입력 데이터에 대한 파싱을 수행하면서 정규 표현식을 사용하였고, 파이썬을 사용해보았다면 split method 가 정규 표현식을 사용하는 대표적인 예가 되겠다.

실제로 파싱 작업을 할 때 정규 표현식을 자주 쓴다.

항목

^x
 문자열의 시작을 표현하며 x 문자로 시작됨을 의미한다.
x$
 문자열의 종료를 표현하며 x 문자로 종료됨을 의미한다.
.x
 임의의 한 문자의 자리수를 표현하며 문자열이 x 로 끝난다는 것을 의미한다.
x+
 반복을 표현하며 x 문자가 한번 이상 반복됨을 의미한다.
x?
 존재여부를 표현하며 x 문자가 존재할 수도, 존재하지 않을 수도 있음을 의미한다.
x*
 반복여부를 표현하며 x 문자가 0번 또는 그 이상 반복됨을 의미한다.
x|y
 or 를 표현하며 x 또는 y 문자가 존재함을 의미한다.
(x)
그룹을 표현하며 x 를 그룹으로 처리함을 의미한다.
(x)(y)
그룹들의 집합을 표현하며 앞에서 부터 순서대로 번호를 부여하여 관리하고 x, y 는 각 그룹의 데이터로 관리된다.
(x)(?:y)
그룹들의 집합에 대한 예외를 표현하며 그룹 집합으로 관리되지 않음을 의미한다. 
x{n}
 반복을 표현하며 x 문자가 n번 반복됨을 의미한다.
x{n,}
 반복을 표현하며 x 문자가 n번 이상 반복됨을 의미한다.
x{n,m}
 반복을 표현하며 x 문자가 최소 n번 이상 최대 m 번 이하로 반복됨을 의미한다.

아래에 나오는 [] 는 특수한 표현법으로 대괄호 안에 있는 문자 단 하나를 선택한다는 의미이다

[xy]
문자 선택을 표현하며 x 와 y 중에 하나를 의미한다.
[^xy]
not 을 표현하며  x 및 y 를 제외한 문자를 의미한다.
[x-z]
range를 표현하며 x ~ z 사이의 문자를 의미한다. 
\^
escape 를 표현하며 ^ 를 문자로 사용함을 의미한다.
\b
word boundary를 표현하며 문자와 공백사이의 문자를 의미한다.
\B
non word boundary를 표현하며 문자와 공백사이가 아닌 문자를 의미한다.
\d
digit 를 표현하며 숫자를 의미한다. 
\D
non digit 를 표현하며 숫자가 아닌 것을 의미한다. 
\s
space 를 표현하며 공백 문자를 의미한다. 
\S
non space를 표현하며 공백 문자가 아닌 것을 의미한다.
\t
tab 을 표현하며 탭 문자를 의미한다.
\v
vertical tab을 표현하며 수직 탭(?) 문자를 의미한다.
\w
word 를 표현하며 알파벳 + 숫자 + _ 중의 한 문자임을 의미한다. 
\W
non word를 표현하며 알파벳 + 숫자 + _ 가 아닌 문자를 의미한다. 

다만 오토마타 정규문법에서도 우선형, 좌선형 문법만을 포함할 수 있듯 정규 표현식 또한 선형 문자열 모두를 포함할 수 있는 규칙을 생성할 수는 없는 것 같다

(" ", "a", "ab", "aab" ...) 를 모두 포함하는 표현식은 있어도 딱 좌측의 문자열만을 나타내는 표현법은 존재하지 않는다. 실제로 정규 표현은 스택을 하나밖에 못쓰는 구조이고, 문맥 자유 문법으로 넘어가야 스택을 2개 사용한다.

대표적 사용

핸드폰 번호

/^01([0|1|6|7|8|9])-?([0-9]{3,4})-?([0-9]{4})$/

/^ : 시작
그룹화
| : 꼭 하나는 포함하도록
[] : 그 중 하나만
[0-9] : 0-9사이 선택
{3,4} : 3 또는 4번 반복
$/ : 종료

이메일

/^[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*\.[a-zA-Z]{2,3}$/i

[0-9a-zA-Z] : 숫자 또는 알파벳 대소문자로 시작
(여러 기호가 올 수도 있고 아닐 수도 있으며, 숫자 또는 알파벳 대소문자) 가 반복
뒤 형식도 동일

profile
https://ppaksang.tistory.com/ 옮겼습니다 !!

0개의 댓글