2020년 6월 14일 일요일

python 의 r prefix 의미


앞에서 정규식을 사용하는 코드에 대해 알아보았습니다.

import re

p = re.compile(r"\[[^\[]*\]")

print("**** 1 ****")
result = p.findall(" [Data Hellox Hello [datax data ")
print(type(result))
print(result)
print(len(result))


print("**** 2 ****")
result = p.findall(" [Data Hello] Hello [data] data ")
print(result)

result = p.finditer(" [Data Hello] Hello [data] data ")
for r in result: 
	print("group:",r.group())
	print("start:",r.start())
	print("end:",r.end())
	print("span:",r.span())


print("**** 3 ****")
data = re.sub(r"\[[^\[]*\]",""," [Data Hello] Hello [data] data ")
print(data)
print("replace XX")
data = re.sub(r"\[[^\[]*\]","XX"," [Data Hello] Hello [data] data ")
print(data)

이때 특이한 정규표현식 "\[[^\[]*\]" 앞에 r 이라는 글자가 보입니다.

r이 뭐하는 것일까요?

위예제에서는 없어도 잘 동작합니다.

아래 예제를 보면 좀 더 명확해집니다. 

print("\[[^\[]*\]")
print(r"\[[^\[]*\]")
print("\\[[^\\[]*\\]")
print(r"\n")
print("\n")

결과
\[[^\[]*\]
\[[^\[]*\]
\[[^\[]*\]
\n


r 이 없으면 \가 특수 문자를 표현하기 위한 용도록 사용되고 r이 있으면 순수하게 문자로 사용됩니다.

즉 앞에서 했던 예제는 3줄이 모두 결과가 같기 때문에 r이 있던 없던 동작이 같았습니다.
r의 의미는 raw string 이란 의미로 사용됩니다.

Both string and bytes literals may optionally be prefixed with a letter 'r' or 'R'; such strings are called raw strings and treat backslashes as literal characters. As a result, in string literals, '\U' and '\u' escapes in raw strings are not treated specially. Given that Python 2.x’s raw unicode literals behave differently than Python 3.x’s the 'ur' syntax is not supported.


댓글 없음:

댓글 쓰기