R 정규표현식 : 남들은 잘 모르는 기초

Kw-H. Kim
3 min readFeb 25, 2019

--

정규표현식에 관한 글이 많지만, 대부분은 가장 기초적인 내용을 빠트리고 있다.

“R 정규표현식에는 2가지 종류의 탈출문자가 쓰인다. 하나는 따옴표를 쓸 때, 다른 하나는 정규표현식에서!”

다음의 코드를 보자.

print('abc\b\tabc')
cat('abc\b\tabc')

'abc\b\tabc' 는 문자열 자료형이다. 'abc\b\tabc' 는 여덟 문자로 구성되어 있다: 'a', 'b', 'c', '\b', '\t', 'a', 'b', 'c'.

여기서 '\b' 는 두 문자처럼 보이지만 따옴표 안의 \ 은 탈출 문자로 다음 문자와 합쳐져서 새로운 의미를 갖게 된다. '\b' 는 문자 \ 과 아무 관련이 없고 “백스페이스”라는 제어 문자를 의미한다.

R은 ' 또는 " 안의 문자들을 해석하게 되는데, '\b' 은 백스페이스, '\t' 은 탭을 의미한다. 함수 print 는 문자열을 출력할 때 따옴표 안에 출력해서 제어 문자는 '\b' 또는 '\t'로 출력하지만 함수 cat는 문자열을 따옴표 없이 출력해서 제어문자의 효과를 확인할 수 있다.

R이 이런 탈출 문자를 사용하는 이유는 키보드로는 입력할 수 없는 문자들을 입력하기 위해서이다. 유니코드의 많은 문자들은 '\Uxxxx'와 같은 형식으로 손쉽게 입력할 수 있다(여기서 xxxx은 유니코드 코드 포인트를 나타낸다. 16진수 숫자).

R의 정규표현식도 역시 탈출 문자를 사용하는데, R의 문자열과 동일한 탈출문자(백슬래쉬)를 사용하기 때문에 주의가 요구된다. 다음의 예를 보자.

grepl('\e', '\x1b')
grepl('\\e', '\x1b')

첫 번째 줄은 에러가 발생하는데 R의 문자열에서는 '\e' 가 어떤 의미도 가지고 있지 않기 때문이다. 하지만 두 번째 줄은 정상 작동한다. 두 번째 줄의 '\\e'를 보자. R은 따옴표 안의 '\\' 를 문자 \ (백슬래쉬)로 해석한다. 따라서 '\\e' 는 백슬래쉬와 문자 e를 의미한다. 따라서 grepl('\\e', '\x1b') 은 패턴 \e를 찾는 것이다. R 정규표현식에서 \ 은 탈출 문자이고 \e 은 ESC 키를 의미하는데, 대부분의 경우 '\x1b'과 동일하다. 따라서 두 번째 줄은 정상 작동하는 것이다.

하지만 정규표현식의 탈출문자는 pattern=의 인자로 쓰일 때에만 정상 작동함을 유의하자. 따라서 cat('\e')은 작동하지 않고 cat('\\e')\e를 의미한다(백슬래쉬와 문자 e).

R의 정규표현식와 따옴표에 관해서는 콘솔에서 ?regex?"'" 를 입력해서 확인할 수 있다. 하지만 문서가 정확하게 설명하지 못하는 부분이 있으니 유의해서 읽을 필요가 있다.

R 정규표현식에서 쓰이는 표현의 예는 다음과 같다.

--

--