지극히 개인적인 공부 노트/기타

[Regular Expression] 정규 표현식

AS J 2021. 8. 8. 21:11

1. 정규 표현식이란?

특정한 규칙을 가진 문자열의 집합을 표현할 때 사용하는 형식을 의미하며, 정규식이라고도 한다.

정규 표현식은 파이썬, 리눅스 등 다양한 언어에서 구분 없이 사용할 수 있고, 정확히 이해하고 있다면 유용하게 사용할 수 있다.

 

2. 정규 표현식 문법

특정 문자들은 특정한 논리적 관계를 나타내는 기호로 표현한다.

기호를 제외한 나머지 문자는 일반적으로 해당 문자 그대로를 의미한다.

 

3. 정규 표현식 기호

정규 표현식의 문법을 표현하기 위해서 메타 문자라는 특정 문자 기호를 정했고, 기본 문자 형식, 수량 한정자, 패턴(선택 패턴, 그룹 패턴) 등을 표현할 수 있다.

기본 메타 문자

기본적으로 사용되는 메타 문자는 아래 표와 같다. 파이썬에서 사용되는 이스케이프(escape) 문자와도 비슷한 느낌을 받을 수 있는데, 크게 보면 이스케이프 문자 또한 메타 문자의 한 종류로 볼 수 있다.

메타 문자 의미
^ 문자열의 시작
$ 문자열의 끝
. 하나의 문자와 대응
\s 공백 문자
\S 공백 문자가 아닌 것
\ 메타 문자를 문자 그대로 사용 ex) \\: 역슬래시(\) 문자 하나를 그대로 사용
\d 숫자
\D 숫자가 아닌 것
\w 알파벳 대소문자, 숫자, 언더스코어(_)
\W \w에 해당하지 않는 글자(알파벳 대소문자, 숫자, 언더스코어가 아닌 그 외의 문자)
\n 개행 문자(줄바꿈)
\t 탭(tab) 문자

참고: https://www.ibm.com/docs/ko/netcoolomnibus/8.1?topic=SSSHTQ_8.1.0/com.ibm.netcool_OMNIbus.doc_8.1.0/omnibus/wip/common/reference/omn_ref_re_backslashsequences.html 

 

수량 한정자
수량자 의미
? 0개 또는 1개
* 0개 이상
+ 1개 이상
{n} n개
{n, m} n개 이상, m개 이하
{n, } n개 이상

참고: https://www.ibm.com/docs/ko/netcoolomnibus/8.1?topic=SSSHTQ_8.1.0/com.ibm.netcool_OMNIbus.doc_8.1.0/omnibus/wip/common/reference/omn_ref_re_metacharacters.html 

 

패턴

1) 선택 패턴

선택 문자 의미
| '또는(or)'과 같은 의미 ex) apple|banana : apple, banana 문자열 둘 중 하나라도 있다면 문자열을 일치시킨다.
[ ] 대괄호 속 문자 패턴에 맞는 문자열을 일치시킨다.
[0-9] 10진수 숫자가 포함되어 있는 문자열을 일치시킨다.
[A-Z] 대문자 알파벳이 포함되어 있는 문자열을 일치시킨다.
[a-z] 소문자 알파벳이 포함되어 있는 문자열을 일치시킨다.
[^] 대괄호 속에서 '^' 문자는 not의 의미를 갖는다. ex) [^0-9] : 숫자가 포함되지 않은 문자열을 일치시킨다.

참고: https://www.ibm.com/docs/ko/netcoolomnibus/8.1?topic=SSSHTQ_8.1.0/com.ibm.netcool_OMNIbus.doc_8.1.0/omnibus/wip/common/reference/omn_ref_re_bracketexpressions.html 

2) 그룹 패턴

그룹 문자 의미
( ) 소괄호 안의 문자를 하나의 문자 패턴으로 간주해야 함을 의미. 한 번 생성한 그룹은 재사용이 가능하며, 만들어진 순서로 1번, 2번 등으로 참조(\숫자 또는 수량 한정자)가 가능하다.
ex) (to)ma\1 : 문자열 'tomato'와 매칭이 된다.

 

이런 정규 표현식을 사용하여 다음 조건에 맞는 전화번호 문자열을 찾으려고 할 때 다음과 같이 사용할 수 있다.

조건
1. 전화번호는 010으로 시작하며, 010 이후엔 숫자가 4개씩 2번 나온다.
2. 그리고 010과 숫자 4개씩 이루어진 문자열 2개의 각 사이엔 알파벳이나 숫자가 아닌 문자열이 0개일 수도 있고, 0개가 아닐 수도 있다.
ex) 01012345678, 010-1234-5678 둘 다 전화번호로 일치시킨다.

이 조건을 정규 표현식으로 나타내면 다음과 같다.

^010(\D?\d{4}){2}
또는
^010(\D?\d{4})\1  # 그룹 패턴 참조