정규 표현식

Overview

Teaching: 20 min
Exercises: 25 min
Questions
  • 본인 작업에 정규 표현식을 사용한다는 사실이 상상이 가는가?

Objectives
  • 검색에 정규 표현식을 사용한다.

정규 표현식(Regular expressions)

정규 표현식은 많은 프로그래밍 환경에서 정교한 패턴을 매칭하는데 사용되는 개념이면서 구현체이도 하다. 믿을 수 없을 정도로 강력한 도구라서 데이터와 파일에서 무언가를 찾고 관리하고 변형시키는 능력을 획기적으로 증대시킨다.

정규 표현식(regular expression)을 줄여서 regex로 표기하기도 한다. 문자 순열을 사용해서 문자열을 매칭하도록 검색을 정의하는 방법(“찾아서 바꾸는(find and replace)” 유형의 연산)으로 알려져 있다. 전산(computation)에서 문자열(string)은 인접한 기호 또는 값의 순열이다. 예를 들어, 단어, 날짜, 숫자 집합(예를 들어, 전화번호), 알파벳 영숫자 값(예를 들어, 식별자)이 이에 해당된다. 도서관 검색에서 “와일드 카드 문자”로 알려진 일부 정규표현식 사용에는 누구나 친숙하다. 하지만, 완전한 정규 표현식 구문에는 훨씬 더 많은 기능이 있다. 정규 표현식을 통해서 다음 기능을 익힐 수 있다:

정규표현식은 문자 그대로의 문자(리터럴 문자, literal character)와 메타문자 사용을 기반으로 한다. 메타문자(metacharacter)는 특별한 의미를 갖는 ASCII 문자를 지칭한다. 메타문자와 리터럴 문자를 사용함으로써 특정 문자열 보다는 패턴과 매칭되는 문자열 혹은 파일을 찾아낼 수 있는 정규 표현식을 만들어 낼 수 있게 된다. 예를 들어, 지역코드를 감싼 괄호를 제거해서 웹사이트에 전화번호 표시방법을 바꾸는 경우를 가정해보자. 전화번호 전부를 찾거나 (상당히 시간이 많이 걸리고 실수하기 쉽다.) 여는 괄호 문자를 전수 조사하는 것(상당히 시간도 많이 걸리고 거짓 양성이 많을 수 있음)보다 전화번호 패턴을 찾는 것도 방법이다.

정규표현식에는 일부 ASCII 문자를 문자 그대로 의미를 갖는 이상의 “메타문자”로 정의한다. 따라서, 메타문자를 문자 그대로 사용하려면 메타문자에서 탈출(escape)시키는 것이 필요하다. 예를 들어 마침표(.)은 “모든 문자와 일치시켜라(match any character)”를 의미해서 마침표(.)를 매칭시키고자 하는 경우, 마침표 앞에 \을 사용해서 정규표현식에 다음 사실을 알려야 한다; 마침표를 메타문자가 아니라 문자 그대로 마침표로 사용함. 이러한 표기법은 특수 문자 탈출(escape)이라고 불린다. 특수 문자를 탈출(escape)시키는 개념은 마크다운과 HTML을 포함한 다양한 컴퓨팅 환경에서 공유되기도 한다.

매우 단순한 정규표현식 사용례로 동일한 단어로 두가지 방식으로 철자가 적힌 곳을 찾아내는 것을 들 수 있다. 예를 들어 정규표현식 organi[sz]e은 “organise”와 “organize”을 동시에 매칭해서 찾아낸다. 하지만, reorganise, reorganize, organises, organizes, organised, organized 등등도 매칭시키기도 한다.

많이 사용되는 정규표현식 메타문자 학습

꺾쇠를 사용하면 문자 범위와 목록을 정의해서 패턴을 구성할 수 있다. 그래서:

다음도 있다:

그렇다면 ^[Oo]rgani.e\b이 매칭시키는 것은 무엇일까?

경규표현식에 특수 문자를 사용해서 매칭시키기

정규표현식 ^[Oo]rgani.e\b이 매칭시키는 것은 무엇일까?

해답

organise
organize
Organise
Organize
organife
Organike

즉, o 혹은 대문자 O로 시작하는 행을 먼저 매칭시키고, rgani이 다음에 위치하고 7번째 위치에는 임의 어떤 문자도 상관이 없고, e 문자로 끝나는 문자열만 매칭시킨다.

기타 유용한 특수 문자는 다음과 같다:

그렇다면, 다음 정규표현식이 매칭하는 것은 무엇일까요?

^[Oo]rgani.e\w*

정규표현식 ^[Oo]rgani.e\w* 구문이 매칭하는 것은 무엇일까요?

해답

organise
Organize
organifer
Organi2ed111

즉, o 혹은 대문자 O로 시작하는 행을 먼저 매칭시키고, rgani이 다음에 위치하고 7번째 위치에는 임의 어떤 문자도 상관이 없고, e 문자가 그 다음에 위치하고, [A-Za-z0-9] 범위 문자가 0번 이상 출현하면 된다.

[Oo]rgani.e\w+$

정규표현식 [Oo]rgani.e\w+$ 구문이 매칭하는 것은 무엇일까요?

해답

organiser
Organized
organifer
Organi2ed111

즉, o 혹은 대문자 O로 시작하는 행을 먼저 매칭시키고, rgani이 다음에 위치하고 7번째 위치에는 임의 어떤 문자도 상관이 없고, e 문자가 그 다음에 위치하고, [A-Za-z0-9] 범위 문자가 적어도 한번 이상 출현해야 된다.

^[Oo]rgani.e\w?\b

정규표현식 ^[Oo]rgani.e\w?\b 구문이 매칭하는 것은 무엇일까요?

해답

organise
Organized
organifer
Organi2ek

즉, o 혹은 대문자 O로 시작하는 행을 먼저 매칭시키고, rgani이 다음에 위치하고 7번째 위치에는 임의 어떤 문자도 상관이 없고, e 문자가 그 다음에 위치하고, [A-Za-z0-9] 범위 문자가 0 혹은 1번 문자로 끝나면 된다.

^[Oo]rgani.e\w?$

정규표현식 ^[Oo]rgani.e\w?$ 구문이 매칭하는 것은 무엇일까요?

해답

organise
Organized
organifer
Organi2ek

즉, o 혹은 대문자 O로 시작하는 행을 먼저 매칭시키고, rgani이 다음에 위치하고 7번째 위치에는 임의 어떤 문자도 상관이 없고, e 문자가 그 다음에 위치하고, [A-Za-z0-9] 범위에서 나온 문자가 0 혹은 1번 출현되야 한다.

\b[Oo]rgani.e\w{2}\b

정규표현식 \b[Oo]rgani.e\w{2}\b 구문이 매칭하는 것은 무엇일까요?

해답

organisers
Organizers
organifers
Organi2ek1

즉, 단어 경계 다음에 o 혹은 대문자 O로 시작하는 행을 먼저 매칭시키고, rgani이 다음에 위치하고 7번째 위치에는 임의 어떤 문자도 상관이 없고, e 문자가 그 다음에 위치하고, [A-Za-z0-9] 범위에서 나온 문자가 2번 출현되야 한다.

\b[Oo]rgani.e\b|\b[Oo]rgani.e\w{1}\b

정규표현식 \b[Oo]rgani.e\b|\b[Oo]rgani.e\w{1}\b 구문이 매칭하는 것은 무엇일까요?

해답

organise
Organi1e
Organizer
organifed

이런 로직이 유용한 경우는 디렉토리에 파일이 아주 많을 때, 파일이 논리적인 파일명을 갖고 있는 경우, 파일 일부에 대해서 격리작업을 수행할 때가 이에 해당된다. 스프레드쉬트 셀에서 특정 값을 찾거나 새로운 칼럼을 생성할 때 스프레드쉬트 칼럼에서 데이터 일부를 추출할 때도 유용하다. 중요한 것은 많은 경우에 대단히 유용하다는 것이다. 그런데, 이런 지식을 내재화하는데 컴퓨터를 사용하지 않고 종이와 연필을 사용할 것이다.

연습문제

Work in teams of 4-6 on the exercises below. When you think you have the right answer, check it against the solution. 아래 연습문제를 해결하는데 4-6명이 팀을 이뤄 진행한다. 정답을 도출했다고 판단되면 해답을 열어본다.

연습문제를 모두 풀게되면 팀을 두 그룹으로 나눠서 서로에게 정규표현식 문제를 만들어 준비한다. 연습문제에는 a) 상대팀이 작성해야 되는 대상 문자열과 함께 b) 상대팀이 작성해야 되는 정규표현식이 담겨져야 한다.

그리고 나서 상대방의 정답과 확인한다. 정규표현식 로직이 맞는 확인하려면 regex101, myregexp, regex pal, regexper.com을 참조한다; 첫 3개 사이트는 작성한 정규표현식이 매칭하는 문자열을 확인하는데 도움이 되고, 마지막은 정규표현식 동작 흐름을 시각적으로 파악할 수 있게 도움을 줄 수도 있다.

꺾쇠 괄호 사용

정규표현식 Fr[ea]nc[eh] 구문이 매칭하는 것은 무엇일까요?

해답

French
France
Frence
Franch

해답 앞뒤로 Francer, foobarFrench, Franch911와 같은 단어도 매칭으로 찾아낸다.

달러 기호 사용하기

정규표현식 Fr[ea]nc[eh]$ 구문이 매칭하는 것은 무엇일까요?

해답

French
France
Frence
Franch

행 끝에 위치한 문자열을 찾아낸다. foobarFrench와 같이 앞에 문자가 붙은 단어도 검출해 낸다.

선택옵션 도입

행 시작지점에 French, France 문자열과 매칭되는 정규표현식을 작성하시오?

해답

^France|^French

Frenchness처럼 French 다음에 오는 문자도 매칭에 포함된다.

대소문자 구분하지 않음

colour , color 같이 (대소문자 구분하지 않음) 전체 단어 전체를 매칭하는 정규표현식을 어떻게 작성하는가?

해답

\b[Cc]olou?r\b|\bCOLOU?R\b
/colou?r/i

실무에서, 대소문자를 구분하지 않는 변형 colour, color, Colour, Color, COLOUR, COLOR이 떠오르지만, coLour 유형은 해당되지 않는다. 따라서 지금까지 학습한 것에 기초하여, 나름 합리적인 정규표현식은 \b[Cc]olou?r\b|\bCOLOU?R\b와 같이 작성할 수 있다. 지금까지 논의하지 않은 좀더 우아한 선택 옵션은 / 구분자를 사용해서 대소문자 구분을 무시하는 플래그를 추가하는 방법이 있다: /colou?r/i 정규표현식은 colour, color 단어 대해서 대소문자 구분하지 않고 모두 매칭시킨다.

단어 경계

전체 단어 headrest, head rest는 매칭시키지만 head rest 처럼 headrest 공백이 두개 들어간 것은 제외시키는 정규표현식은 어떻게 작성하는가?

해답

\bhead ?rest\b
\bheadrest\b|\bhead\srest\b

\bhead\s?rest\b 정규표현식을 통해 매칭이 잘 구현되었지만, headrest 사이 0번 혹은 1회 탭/개행문자를 매칭시킬 수 있다. 그래서, 실무에서 사용해도 괜찮지만, 엄밀하게 따면 옳은 정규표현식은 아니다.

비언어적(non-linguistic) 패턴 매칭

0 다음에 문자 4개로 끝나는 문자열을 찾아내는 패턴을 정규표현식으로 나타내시오?

해답

0+[A-Za-z]{4}\b

숫자 매칭

아무 곳에서나 숫자 4개로 구성된 문자열을 매칭시키는 정규표현식을 작성하시오?

해답

\d{4}

주의: 숫자와 문자로 좀더 길게 구성된 문자열 내부 숫자 4개 문자열도 매칭시킨다.

날짜 매칭

날짜 포맷 dd-MM-yyyy을 매칭시키는 정규표현식을 작성하시오?

해답

\b\d{2}-\d{2}-\d{4}\b

작업하는 데이터 유형에 따라 단어경계(\b)는 제거시킬 수도 있다.

다양한 날짜 형식 매칭

행 마지막에 위치한 dd-MM-yyyy, dd-MM-yy 날자 형식을 매칭시키는 정규표현식을 작성하시오?

해답

\d{2}-\d{2}-\d{2,4}$

행 말미에 위치한 31-01-198 같은 문자열도 매칭시킨다. 따라서 데이터를 확인하고 이와 같은 거짓 양성(false positive)을 제거하도록 정규 표현식을 수정한다. 작업하는 데이터에 따라 정규표현식 시작부에 단어 경계(\b)를 추가하는 것도 가능하다.

출판 형식 매칭

British Library : London, 2015, Manchester University Press: Manchester, 1999 와 같은 출판 형식(publication format)을 매칭시키는 정규표현식을 작성하시오.

해답

.* ?: .*, \d{4}

단어 경계 없이 British 혹은 Manchester 단어 앞에 임의 텍스트를 매칭하는 출판물을 검색할 수 있다. 그럼에도 불구하고, 정규표현식이 첫번째 매칭에서 나름 좋은 성과를 내고 있지만, 데이터 형태에 따라서 다시 한번 정규표현식을 정교하게 할 필요도 있다.

Regex101.com, https://regexr.com/을 사용한 연습문제

이번 학습에서, 브라우저를 열고, https://regex101.com 혹은 https://regexr.com/ 웹사이트로 이동한다.

swcCoC.md file 파일을 열어서 복사해서 Text 혹은 TEST STRING 박스에 붙여넣는다.

정상적으로 동작하는지 파악하기 위해서, 정규표현식 박스에 community 문자열을 타이핑해서 입력시킨다.

화면을 살펴보면 community 문자열이 6번 매칭된 것이 하이라이트 강조되어 표시되어 있다.

공백도 고려해보자.

community 타이핑을 한다. 매칭된 것이 3개 나온다. 왜 6개가 아닐까?

해답

‘community-led’는 첫 검색에서는 매칭이 되지만, 공백이 반영된 두번째 매칭에서 - 문자로 인해 매칭되지 않는다.

임의 문자도 고려해 보자

community 표현식에 ‘community-led’도 매칭되도록 또다른 정규표현식 문자를 추가한다면, 무엇이 될까?

해답

아마도 ., 따라서 community.

다른 문자를 매칭하는 정규표현식의 (역)효과를 탐색

정규표현식을 communi로 변경시키게 되면, 매칭되는 단어가 13 개가 된다. 왜 그럴까?

해답

원인은 ‘communi’ 문자열이 communication 과 community 를 포함하는 단어에 모두 담겨있기 때문이다. 정규표현식에 단어 경계(\b)가 없기 때문에 communicado 단어도 텍스트에 포함된 경우 매칭시킨다. incommunicado을 텍스트 박스 아무곳에 타이핑하면, 정규표현식이 이 단어를 매칭시키는지 확인해보라.

대문자도 고려해보자

[Cc]ommuni 정규표현식을 타이핑하면, 14개만 매칭된다. 이유는 무엇일까?

해답

단어 Community가 대문자 C와 소문자 c로 14번 텍스트에 출현한다.

위치를 특정하는 정규표현식 문자

^[Cc]ommuni 정규표현식을 타이핑하면 매칭되는 결과가 하나도 없다. 왜일까?

해답

행 시작지점에 매칭되는 문자열은 하나도 없다. 텍스트를 읽어보고, ^ 뒤에 문자열을 행시작지점에 출현하는 단어로 교체해보라. 문자열이 매칭되어 검색이 되는가?

복수형 찾아내기

복수형을 갖는 Comm 혹은 comm 문자열로 시작되는 모든 단어를 찾아내보자.

Solution

[Cc]omm\w+s\b

[Cc] 표현식은 대소문자 c를 검출해낸다.

omm 은 매칭되는 직접적인 문자열.

\w+ 앞선 원소(단어 문자)를 한번 이상 매칭시킨다.

s 은 매칭되는 직접적인 문자열.

\b 은 단어 마지막 위치에 s가 위치하도록 확실히 한다.

전자우편 주소를 찾아내는 연습문제 regex101.com을 활용

이번 학습에서, 브라우저를 열고, https://regex101.com 혹은 https://regexr.com/ 웹사이트로 이동한다.

swcCoC.md file 파일을 열어서 복사해서 Text 혹은 TEST STRING 박스에 붙여넣는다.

본인이 알고 있는 것부터 차분히 시작해보자

모든 전자우편 주소에 공통으로 들어있는 문자는 무엇인가?

해답

골뱅이 ‘@’ 문자.

본인이 알고 있는 것을 추가하자.

”@” 앞에 문자열이 임의 단어 문자, 특수 문자, 숫자가 다양한 길이로 조합되어 표현된다. 정규표현식으로 어떻게 표현할 수 있을까? 힌트: 전자우편 주소에 대쉬(-)가 포함되는데, 단어문자 표현식(\w)에는 대쉬가 포함되어 있지 않다. 따라서 이점을 정규표현식에 어떻게 반영하여 전자우편주소를 추출할 수 있을까?

해답

[\w.-]+@

\w 숫자와 밑줄(_)을 포함한 임의 단어 문자를 매칭시킨다.

\. 임의 문자를 매칭시킨다.

- 대쉬를 매칭시킨다. 이유는 \.으로 잡아낼 수 없기 때문이다.

[] 꺾쇠 괄호기호로 숫자, 단어 문자, 단어, 대쉬를 ‘또는(OR)’ 방식으로 잡아내도록 지정한다.

+ 기호는 임의 단어 문자 혹은 숫자 혹은 단어 혹은 대쉬(-)가 1회 이상 반복 매칭되도록 지정한다.

정규표현식 마무리

”@” 뒤에 오는 문자열은 임의 단어 문자, 특수 문자, 숫자 뿐만 아니라 대쉬도 다양한 길이로 조합되어 표현된다. 추가로, 마침표(.) 뒤에 두개 혹은 세개 문자로 끝나는 사실도 알고 ㅣㅇㅆ다. 정규표현식을 어떻게 표현하면 이를 잡아낼 수 있을까? 힌트: . 자체도 정규표현식이라 .을 문자 그대로 표현하려면 \을 사용해서 탈출시켜야 된다.

해답

[\w.-]+\.[\w]{2,3}

\. 은 정규표현식 . 이 아니라 문자 그래도 마침표(‘.’)을 매칭시킨다.

\w 숫자와 밑줄(_)을 포함한 임의 단어 문자를 매칭시킨다.

{2,4} limits the number of word characters and/or digits to a two or three-character string.

[] 꺾쇠 괄호기호로 숫자, 단어 문자, 단어, 대쉬를 ‘또는(OR)’ 방식으로 잡아내도록 지정한다.

+ 기호는 임의 단어 문자 혹은 숫자 혹은 단어 혹은 대쉬(-)가 1회 이상 반복 매칭되도록 지정한다.

구글링(googling): Email Address Regular Expression That 99.99% Works.

전화번호를 찾아내는 연습문제 regex101.com을 활용

카펜트리 Code of Conduct에 전화번호가 담겨있을까?

정규표현식 작성 시에 고려할 사항:

  1. ”+”로 시작하는 국가 코드가 포함될 수도 없을 수도 있음.
  2. 괄호로 쌓인 상태로 지역코드가 전화번호에 포함될 수도 있음.
  3. ”-“으로 잘 구분된 형태로 전화번호가 작성될 수도 있음.

본인이 알고 있는 것부터 시작한다: 숫자 문자열을 매칭한다.

본인이 알고있는 것부터 시작한다. 가장 기본적인 전화번호 형식은 무엇인가: 숫자 3개, 대쉬, 숫자 4개. 전화번호 형식을 매칭시키는 정규표현식을 어떻게 작성할까?

해답

\d{3}-\d{4}

\d 임의 숫자를 매칭시킨다.

{3} 숫자를 3번 매칭시킨다.

- 문자 ‘-‘을 매칭시킨다.

\d 임의 숫자를 매칭시킨다.

{4} 숫자를 4번 매칭시킨다.

상기 정규표현식은 문서에서 3번 매칭된 결과를 반환해야 한다.

대쉬 지역코드를 포함하는 문자열을 매칭시킨다.

본인이 알고있는 것부터 시작한다. 가장 기본적인 전화번호 형식은 무엇인가: 숫자 3개, 대쉬, 숫자 4개. 지역코드(숫자 3개와 대쉬)를 포함하도록 정규표현식을 어떻게 확장할 수 있을까?

해답

\d{3}-\d{3}-\d{4}

\d 임의 숫자를 매칭시킨다.

{3} 숫자를 3번 매칭시킨다.

- 문자 ‘-‘을 매칭시킨다.

\d 임의 숫자를 매칭시킨다.

{4} 숫자를 4번 매칭시킨다.

상기 정규표현식은 문서에서 1번 매칭된 결과를 반환해야 한다.

공백을 두거나 두지 않고 나머지 전화번호와 떨어져서 괄호로 지역코드를 담고 있는 전화번호 문자열을 매칭시켜라

본인이 알고있는 것부터 시작한다. 가장 기본적인 전화번호 형식은 무엇인가: 숫자 3개, 대쉬, 숫자 4개. 공백을 두거나 두지 않고 나머지 전화번호와 떨어져서 괄호로 지역코드를 담고 있는 전화번호 문자열을 매칭시킬 수 있도록 정규표현식을 확장할 수 있을까?

해답

\(\d{3}\) ?\d{3}-\d{4}

\( 여는 괄호를 탈출문자(escape character)로 문자 그대로 매칭시킨다.

\d 임의 숫자를 매칭시킨다.

{3} 숫자를 3번 매칭시킨다.

\) 닫는 괄호를 탈출문자(escape character)로 문자 그대로 매칭시킨다.

? 0번 혹은 1번 이상 공백을 매칭시킨다.

상기 정규표현식은 문서에서 2번 매칭된 결과를 반환해야 한다.

국가코드를 담고 있는 전화번호를 매칭시켜라

국가코드는 “+”로 시작하는데 최대 3개까지 숫자를 가질 수 있다. 국가코드와 다음 전화번호 사이에 공백이 있을 수도 없을 수도 있다.

해답

\+\d{1,3} ?\(\d{3}\)\s?\d{3}-\d{4}

\+ 더하기 문자를 탈출문자(escape character)로 문자 그대로 매칭시킨다.

\d 임의 숫자를 매칭시킨다.

{1,3} 한자리에서 세자리까지 숫자를 매칭시킨다.

? 0번 혹은 1번 이상 공백을 매칭시킨다.

상기 정규표현식은 문서에서 1번 매칭된 결과를 반환해야 한다.

One of the reasons we stress the value of consistent and predictable directory and filenaming conventions is that working in this way enables you to use the computer to select files based on the characteristics of their file names. For example, if you have a bunch of files where the first four digits are the year and you only want to do something with files from ‘2017’, then you can. Or if you have ‘journal’ somewhere in a filename when you have data about journals, you can use the computer to select just those files. Equally, using plain text formats means that you can go further and select files or elements of files based on characteristics of the data within those files.

일관되고 예측가능한 디렉토리와 파일명 규칙을 강조하는 이유 중의 하나는 이런 방식으로 작업이 되어 있는 경우 컴퓨터를 사용해서 파일명 특성에 기초하여 파일을 찾을 수 있기 때문이다. 예를 들어, 파일이 엄청나게 많은데 파일명 첫 네숫자가 연도로 되어 있으며 ‘2017’부터 시작되는 파일로 무언가를 하고자 하는 경우 당연히 작업을 수행할 수 있다. 혹은 저널에 대한 데이터가 있는데 파일명 어딘가에 ‘jounral’이 포함된 경우, 컴퓨터를 사용해서 해당 파일을 찾아낼 수 있다. 평문 텍스트 형식(plain text format)을 사용할 수 있다는 것은 파일을 선택하거나 파일 내부 데이터 특성에 기반하여 파일 구성요소를 추출할 수 있다는 것과 같다.

Key Points