저는 점프투파이썬 교재로 공부합니다. 이 교재를 바탕으로 공부한 걸 정리합니다.
1️⃣ 정규표현식이란? 문자 클래스, Dot(.), 반복(*), 반복(+), 반복({m,n}, ?)
2️⃣ 정규 표현식(2) - 문자열 검색(match, search, findall, finditer)
3️⃣ 정규표현식(3) - match 객체의 메서드(group, start, end, span)
4️⃣ 정규표현식(4) - COMPILE 옵션 - (DOTALL, IGNORECASE, MULTILINE, VERBOSE)
5️⃣ 정규 표현식(5) - 백슬래시 문제('\n')
6️⃣ 정규 표현식(6) 메타 문자 - |, ^, $, \A, \Z, \b, \B
7️⃣ 정규표현식(7) 그루핑, 전방 탐색, 문자열 바꾸기, Greedy vs Non-Greedy
정규 표현식을 파이썬에서 사용할 때 혼란을 주는 요소가 백슬래시(\) 문제입니다.
예를 들어 어떤 파일 안에 있는 "\section" 문자열을 찾기 위한 정규식을 만든다고 가정하겠습니다.
\section
이 정규식은 \s 문자가 whitespace로 해석되어 의도한 대로 매치가 이루어지지 않습니다.
아래의 표현을 보겠습니다.
[\t\n\r\f\v]ection
\s 문자가 이스케이프 코드 \t, \n, \r, \f, \v로 해석됨
의도한 대로 매치하고 싶다면 다음과 같이 변경해야 합니다.
\\section
즉, 위 정규식에서 사용한 \ 문자가 문자열 자체임을 알려주기 위해 백슬래시를 하나 더 써서 사용했습니다.
특수 문자를 검색하려면 특수 문자 앞에 백슬래시를 추가하여 특수 문자를 이스케이프 처리해야 합니다.
이스케이프 처리가 무엇인지 대충 알았네요.
따라서 위 정규식을 컴파일하려면 다음과 같이 작성해야 합니다.
p = re..compile('\\section')
그런데 여기서 또 하나의 문제가 더 생긴다고 합니다.
위처럼 정규식을 만들어서 컴파일하면 실제 파이썬 정규식 엔진에는 파이썬 문자열 리터럴 규칙에 따라 \이 \로 변경되어 \section이 전달됩니다.
결국 정규식 안에 \ 문자를 전달하려면 파이썬은 \\ 처럼 백슬래시를 4개 사용해야 합니다.
p = re.compile('\\\\section')
이렇게 해야만 원하는 결과를 얻을 수 있습니다.
하지만 이 방식도 복잡하단 지적이 나왔습니다.
만약 위와 같이 \를 사용한 표현이 계속 반복되는 정규식이라면 코드를 이해하는데 많은 어려움이 따를 것입니다.
이러한 문제로 파이썬 정규식에는 Raw String 규칙이 생겨나게 되었습니다.
즉, 컴파일 해야하는 정규식이 Raw String
임을 알려줄 수 있도록 파이썬 문법이 추가되었습니다.
p = re.compile(r'\\section')
위와 같이 정규식 문자열 앞에 r 문자
를 삽입하면 이 정규식은 raw string 규칙에 의해 백슬래시 2개 대신 1개만 써도 2개를 쓴 것과 같은 의미를 갖게 됩니다.
만약 백슬래시를 사용하지 않는 정규식이라면 r의 유무에 상관없이 동일한 정규식이 될 것입니다.