이 포스팅은 Regular Expression 시리즈 12 편 중 6 번째 글 입니다.
목차
앞에서 정규식을 표현할 때 우리는 \
문자를 사용했다. 하지만 내가 정규식을 작성하는 데 있어서 \
문자 자체를 찾고 싶다면 어떻게 해야할까?
\section
이렇게 정규식을 작성하게 되면 문제가 발생한다. \s
부분이 whitespace로 해석되어 의도한 대로 매치가 이루어지지 않는다.
[ \t\n\r\f\v]ection
즉, 위와 같은 의미로 해석된다. 이러한 문제에 대해서 해결하고 싶다면 아래와 같게 작성해야 한다.
\\section
파이썬의 문제
위의 과정까지는 아무런 문제가 없다. 하지만 파이썬에서 정규식을 저렇게 작성하면 문제가 발생한다.
>>> p = re.compile('\\section')
파이썬 정규식 엔진에는 파이썬 문자열 리터럴 규칙에 따라 \\
이 \
로 변경되어 \section
이 전달된다. 유닉스의 grep, vi 등에서는 이러한 문제가 없다. 파이썬에서 사용할 때만 발생한다(파이썬의 리터럴 규칙) 결국 정규식 엔진에 //
문자를 전달하기 위해서는 \\\\
이렇게 전달해야 한다.(ㅠ) 정규식 엔진은 정규식을 해석하고 수행하는 모듈이다.
>>> p = re.compile('\\\\section')
정말 번거롭다. 이쁘지도 않고. 이렇게 이해하기 어려운 정규식에 대해서 사람들은 짜증을 표현했다. 이러한 문제로 인해 파이썬 정규식에는 Raw String 규칙이 생겨나게 되었다. 즉 컴파일해야 하는 정규식이 Raw String임을 알려 줄 수 있도록 파이썬 문법을 만든 것이다.
>>> p = re.compile(r'\\section')
위와 같이 정규식 문자열 앞에 r 문자를 삽입하면 이 정규식은 Raw String 규칙에 의하여 백슬래시 2개 대신 1개만 써도 2개를 쓴 것과 동일한 의미를 갖게 된다. 결과적으로 백슬래시를 사용하여 검색을 진행하고자 할때는 raw 표현을 쓰는 것이 좋다.