[Python] 파이썬 문자열 r과 escape 문자
파이썬 문자열 -‘r’의 의미
예전부터 정규표현식 할 때 문자열 앞에 붙는 r
이 무엇인가 궁금했다. 수업을 계기로 궁금했던 것을 정리해 보기로 한다.
1. 개요
기본적으로 파이썬에서 \
는 이스케이프 문자이다. 뒤에 나오는 문자를 문자로 인식하라는 의미이다. 그런데 r
은 raw string으로서, 뒤에 나오는 문자열에서 \
가 이스케이프 문자로 해석되는 것을 방지한다.
그런데 이것을 콘솔에 찍어 보았을 때와 print
를 통해 출력했을 때, \
의 형태(?)가 다르게 나타나는 것을 확인할 수 있었다.
결론적으로 다음과 같이 이해했다.
- 콘솔에 찍었을 때의
Out
으로 나오는 결과는 파이썬이 내부적으로 이해한 것이다. - 출력했을 때 나오는 결과는 파이썬이 내부적으로 이해한 바를 사람들에게 보여주는 것이다.
파이썬이 내부적으로 이해할 때는 r
이 붙어서 생짜 문자로 인식하는지 아닌지에 따라 이해하는 규칙이 달라진다. 기본적으로 r
을 붙여서 생짜 문자로 이해하라는 명령을 내리면, 파이썬은 \
문자 앞에 이스케이프 문자 \
를 붙여서 자신의 기억 속에 저장한다. 그리고 출력할 때에는 이스케이프 문자를 처리해 사람들이 이해하는 형태로 보여주는 것이다.
'\\\''
기본적으로 위의 문자열을 콘솔 창에 찍으면, 파이썬은 0번 인덱스의 '
와 마지막 '
을 문자열을 나타내는 것이라고 생각한다.
그러면 여기서 파이썬이 문자열로 머릿 속에 기억해서 받아들이는 것은 \\\'
이다. 그런데 앞에 r
이 안 붙어 있어서, 문자 중 (홀수 번째에 나오는) \
를 이스케이프 문자로 받아 들인다.
즉, 여기서 파이썬은 “
\
는 문자가 아니구나!” 하고 이해한다.
그러면 파이썬은 머릿 속에서 \\
를 \
하나로, \'
를 '
하나로 이해한다.
이제 print
를 찍어 보자. 다음과 같이 생각하면 된다.
“파이썬아, 너가 갖고 있는 기억을 사람들한테 보여줘 봐.”
그러면 파이썬은 이해한 바를 출력한다.
실제로 실행해서 차이를 비교해 보자.
>>> '\\\'' # '\\''
>>> print('\\\'') # \'
이제 r
을 사용해 보자. 파이썬한테 다음과 같은 명령을 내린다고 생각하자.
“파이썬아,
r
이 붙으면 그 다음에 나오는 모든 건 다 생짜 문자야.”
r'\\\''
r
이 붙었으니까, 처음과 끝 '
안에 있는 모든 게 다 생짜 문자가 된다. 생짜 문자가 되면, 파이썬은 내부적으로 그 앞에 \
를 붙여서 기억한다.
“아,
\
가 다 생짜 문자구나. 그 앞에\
를 붙여서 기억하자.”
따라서 1번 인덱스, 2번 인덱스, 3번 인덱스의 \
는 파이썬 기억 내에 \\
로 저장된다.
이제 콘솔 창에 그대로 찍어 보고, print
를 통해 출력하여 파이썬이 이해한 바와, 그것을 사람들에게 출력할 때의 차이를 보자.
>>> r'\\\'' # '\\\\\\'' : 맨 앞과 맨 뒤의 따옴표는 문자열.
>>> print(r'\\\'') # \\\'
파이썬이 인식하는 문자열의 길이가 어떻게 달라지는지 확인하자.
>>> len(r'b\\\s') # 5
>>> len('b\\\s') # 4
r
을 붙였을 때는 맨 앞의 \
도 문자로 인식되는 것을 알 수 있다.
2. 예시
word = r'back\\\slash$$'
>>> print(word) # back\\\slash$$
>>> print(r'back\\\slash$$') # back\\\slash$$
>>> word # 'back\\\\\\slash$$'
>>> r'back\\\slash$$' # 'back\\\\\\slash$$'
print
를 통해 출력하면 back\\\slash$$
가 나오지만, 콘솔 창에 그냥 찍으면 back\\\\\\slash$$
와 같이 나온다. r
을 붙였을 때 어떻게 이스케이프를 방지함으로써 \
를 2개로 인식하는 것이다.
import re
>>> print(re.findall(r'\\', word)) # ['\\', '\\', '\\']
따라서 위의 문자열에서 \\
를 찾으면, back\\\\\\slash$$
에서 \\
를 찾는 것과 동일한 결과가 출력된다.
>>> print(re.findall('\\\\', word))
위와 같은 의미이다.
word = 'back\\\slash$$t'
>>> print(word) # back\\slash$$t
>>> word # 'back\\\\slash$$t'
>>> print(re.findall(r'\$\$', word)) # ['$$']
>>> print(re.findall('\$\$', word)) # ['$$']
>>> print(re.findall('$$', word)) # ['']
위와 같이 문자열을 바꿔 주면, r
이 붙지 않았기 때문에 맨 앞의 \
가 이스케이프 문자가 된다. 따라서 print
를 통해 출력하면 \
가 2개밖에 없다. 콘솔 창에서 어떻게 출력되는지를 보면, 파이썬 내부에서는 \\\\
로서, 이스케이프 문자를 붙여 \
2개로 인식하고 있다.
$
의 경우는 r
을 붙여서 이스케이프를 해주든 해주지 않든 찾아오는 결과에 차이가 없다. 다만 맨 마지막에서처럼 $$
를 찾으려고 하면, 찾지 못한다.
>>> re.findall(r"\\\\", r"\\") # ['\\\\']
위의 경우, \\\\\\\\
에서 \\\\
를 찾으라는 의미이다.
>>>> re.findall("\\\\", "\\") # ['\\']
위의 경우, \\\\
에서 \\
를 찾으라는 의미이다.
댓글남기기