[Python] 파이썬 문자열 r과 escape 문자

2 분 소요

파이썬 문자열 -‘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("\\\\", "\\") # ['\\']

위의 경우, \\\\에서 \\를 찾으라는 의미이다.



hit count image

댓글남기기