[python] 파이썬의 원시 문자열 리터럴이 단일 백 슬래시로 끝나지 않는 이유는 무엇입니까?

기술적 슬래시 중 홀수,로 기술 문서 .

>>> r'\'
  File "<stdin>", line 1
    r'\'
       ^
SyntaxError: EOL while scanning string literal
>>> r'\\'
'\\\\'
>>> r'\\\'
  File "<stdin>", line 1
    r'\\\'
         ^
SyntaxError: EOL while scanning string literal

파서는 원시 문자열의 백 슬래시를 일반 문자로 처리 할 수있는 것처럼 보입니다 (원시 문자열이 무엇입니까?)



답변

그 이유는 해당 섹션에서 굵게 강조 표시된 부분에 설명되어 있습니다.

문자열 인용 부호는 백 슬래시로 이스케이프 할 수 있지만 백 슬래시는 문자열에 남아 있습니다. 예를 들어, r"\""두 개의 문자 : 백 슬래시와 큰 따옴표로 구성된 유효한 문자열 리터럴입니다. r"\"유효한 문자열 리터럴이 아닙니다 (원시 문자열도 홀수의 백 슬래시로 끝날 수 없음). 특히, 원시 문자열은 단일 백 슬래시로 끝날 수 없습니다 (백 슬래시는 다음 따옴표 문자를 이스케이프하므로). 또한 단일 백 슬래시와 개행 문자는 줄 연속으로가 아니라 문자열의 일부로이 두 문자로 해석됩니다.

따라서 원시 문자열은 100 % 원시가 아니며 여전히 기본적인 백 슬래시 처리가 있습니다.


답변

파이썬의 원시 문자열에 대한 오해는 대부분의 사람들이 원시 문자열 내에서 백 슬래시가 다른 모든 문자와 마찬가지로 일반적인 문자라고 생각한다는 것입니다. 아닙니다. 이해하는 열쇠는이 파이썬의 튜토리얼 순서입니다.

r ‘또는 ‘ R ‘접두사가 있으면 백 슬래시 뒤에 오는 문자가 변경없이 문자열에 포함되고 모든 백 슬래시는 문자열에 남습니다.

그래서 백 슬래시 다음에 오는 모든 문자 입니다 원시 문자열의 일부. 파서가 원시 문자열 (유니 코드가 아닌 문자열)을 입력하고 백 슬래시가 발생하면 2 개의 문자 (백 슬래시와 그 뒤에 오는 문자)가 있음을 알게됩니다.

이 방법:

r’abc \ d ‘a, b, c, \, d로 구성됩니다.

r’abc \ ‘d’a, b, c, \, ‘, d로 구성됩니다.

r’abc \ ”a, b, c, \, ‘

과:

r’abc \ ‘a, b, c, \,’로 구성 되지만 현재 종료 인용은 없습니다.

마지막 사례는 문서에 따르면 파서가 위에서 본 마지막 따옴표가 문자열의 일부이므로 닫는 따옴표를 찾을 수 없다는 것을 보여줍니다.


답변

즉,이 방법! 나는 그것을 파이썬의 작은 결함 중 하나로 봅니다!

나는 그럴만한 이유가 없다고 생각하지만, 확실히 파싱하지는 않는다. \를 마지막 문자로 사용하여 원시 문자열을 구문 분석하는 것은 정말 쉽습니다.

캐치는 \를 원시 문자열의 마지막 문자로 허용하면 원시 문자열 안에 “를 넣을 수 없습니다. 파이썬은 \를 마지막 문자로 허용하는 대신”를 허용하는 것처럼 보입니다.

그러나 이로 인해 문제가 발생하지 않아야합니다.

Windows 폴더 경로를 쉽게 작성할 수없는 것에 대해 c:\mypath\걱정할 경우 걱정하지 마십시오.로 표시 할 수 r"C:\mypath"있으며 하위 디렉토리 이름을 추가해야하는 경우 문자열 연결로 수행하지 마십시오. 어쨌든 그것을하는 올바른 방법이 아닙니다! 사용하다os.path.join

>>> import os
>>> os.path.join(r"C:\mypath", "subfolder")
'C:\\mypath\\subfolder'


답변

슬래시로 원시 문자열을 끝내려면이 트릭을 사용할 수 있습니다.

>>> print r"c:\test"'\\'
test\


답변

또 다른 트릭은 chr (92)를 “\”로 평가하는 것입니다.

나는 최근에 백 슬래시 문자열을 청소해야했고 다음과 같은 트릭이있었습니다.

CleanString = DirtyString.replace(chr(92),'')

나는 이것이 “왜”를 돌보지 않지만 스레드는 즉각적인 문제에 대한 해결책을 찾는 많은 사람들을 끌어 들인다는 것을 알고 있습니다.


답변

\ “는 원시 문자열 내부에서 허용되므로 문자열 리터럴의 끝을 식별하는 데 사용할 수 없습니다.

첫 번째 “”가 발생할 때 문자열 리터럴 구문 분석을 중지하지 않으시겠습니까?

이 경우 문자열 리터럴 안에 \ “를 사용할 수 없습니다. 그러나 그렇습니다.


답변

r'\'구문이 잘못된 이유 는 문자열식이 원시이지만 사용 된 따옴표 (싱글 또는 더블)는 항상 따옴표의 끝을 표시하기 때문에 이스케이프해야하기 때문입니다. 따라서 작은 따옴표로 묶은 문자열 안에 작은 따옴표를 표현하려면 사용하는 것 외에 다른 방법이 없습니다\' . 큰 따옴표에도 동일하게 적용됩니다.

그러나 당신은 사용할 수 있습니다 :

'\\'