지금 점프투파이썬 이란 책으로 공부중인데 다하고 이제 마지막 정규표현식을 배우고있는데, 여기서 




-------------------------------------------------------------------------------------------------------------------------------------------------

백슬래시 문제

정규 표현식을 파이썬에서 사용할 때 혼란을 주는 요소가 한 가지 있는데, 바로 백슬래시(\)이다.

예를 들어 어떤 파일 안에 있는 "\section" 문자열을 찾기 위한 정규식을 만든다고 가정해 보자.

\section

이 정규식은 \s 문자가 whitespace로 해석되어 의도한 대로 매치가 이루어지지 않는다.

위 표현은 다음과 동일한 의미이다.

[ \t\n\r\f\v]ection

의도한 대로 매치하고 싶다면 다음과 같이 변경해야 한다.

\\section

즉 위 정규식에서 사용한 \ 문자가 문자열 자체임을 알려 주기 위해 백슬래시 2개를 사용하여 이스케이프 처리를 해야 한다.

따라서 위 정규식을 컴파일하려면 다음과 같이 작성해야 한다.

>>> p = re.compile('\\section')

그런데 여기에서 또 하나의 문제가 발견된다. 위처럼 정규식을 만들어서 컴파일하면 실제 파이썬 정규식 엔진에는 파이썬 문자열 리터럴 규칙에 따라 \\이 \로 변경되어 \section이 전달된다.

※ 이 문제는 위와 같은 정규식을 파이썬에서 사용할 때만 발생한다(파이썬의 리터럴 규칙). 유닉스의 grep, vi 등에서는 이러한 문제가 없다.

결국 정규식 엔진에 \\ 문자를 전달하려면 파이썬은 \\\\처럼 백슬래시를 4개나 사용해야 한다.

※ 정규식 엔진은 정규식을 해석하고 수행하는 모듈이다.

>>> p = re.compile('\\\\section')

이렇게 해야만 원하는 결과를 얻을 수 있다. 하지만 너무 복잡하지 않은가?

만약 위와 같이 \를 사용한 표현이 계속 반복되는 정규식이라면 너무 복잡해서 이해하기 쉽지않을 것이다. 이러한 문제로 인해 파이썬 정규식에는 Raw String 규칙이 생겨나게 되었다. 즉 컴파일해야 하는 정규식이 Raw String임을 알려 줄 수 있도록 파이썬 문법을 만든 것이다. 그 방법은 다음과 같다.

>>> p = re.compile(r'\\section')

위와 같이 정규식 문자열 앞에 r 문자를 삽입하면 이 정규식은 Raw String 규칙에 의하여 백슬래시 2개 대신 1개만 써도 2개를 쓴 것과 동일한 의미를 갖게 된다.

※ 만약 백슬래시를 사용하지 않는 정규식이라면 r의 유무에 상관없이 동일한 정규식이 될 것이다.

------------------------------------------------------------------------------------------------------------------------------------------------------


1.여기에서 왜 백슬래쉬(\)를 4개나 써야하는지 도저히 이해가안가요... 그냥 \\section만 해주면 \\가 문자\로 인식이 되어서 다시 \section 이되니까 한번더 \를 써줘서 \\\section 으로 해주면되는거아닌가요? 왜 \를 4개나 쓰는거죠?


2.그리고 

"그런데 여기에서 또 하나의 문제가 발견된다. 위처럼 정규식을 만들어서 컴파일하면 실제 파이썬 정규식 엔진에는 파이썬 문자열 리터럴 규칙에 따라 \\이 \로 변경되어 \section이 전달된다."


이문장 다음에

"결국 정규식 엔진에 \\ 문자를 전달하려면 파이썬은 \\\\처럼 백슬래시를 4개나 사용해야 한다."

 어떻게 이렇게 결론이 나는지 이해가 안가요...왜 4개나 써야하죠.... 사실 1번이랑 같은 질문이네요....



3.그럼에도 일단 받아들이고 파이참에서

import re
a=re.compile(r'\\section')
p=a.search('fsdf \section')
print(p)
print(p.group())

이렇게하고 런해봤는데


<re.Match object; span=(5, 13), match='\\section'>

\section 

이렇게 뜨는데 왜 위에 match객체 p를프린트할때는 match=\\section, 즉왜 2번이나 \가 뜨는거죠? 아 뭔가 횡설수설한데 raw string파트가 잘이해가 안되서요 설명해주시면 정말 감사하겠고 아니면 사이트라도 추천해주시면 감사하겠습니다...