정규표현식에 관한 글이 많지만, 대부분은 가장 기초적인 내용을 빠트리고 있다.
“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 정규표현식에서 쓰이는 표현의 예는 다음과 같다.