source

"u" 및 "r" 문자열 프리픽스는 정확히 어떤 역할을 하며 raw 문자열 리터럴은 무엇입니까?

manysource 2022. 10. 15. 09:59

"u" 및 "r" 문자열 프리픽스는 정확히 어떤 역할을 하며 raw 문자열 리터럴은 무엇입니까?

질문을 하면서 저는 생현에 대해 잘 모른다는 것을 깨달았습니다.장고 트레이너를 자처하는 사람치고는 정말 짜증나네

있고 인코딩이 뭔지 있습니다.u''유니코드라는 걸 알기 때문에 혼자서도 알 수 있어요.

  • 하지만 무엇을 하는 거야r''떤떤끈 이이?

  • 을 하는 것인가'라는 것은ur'' 할수 수 do do do?

  • 마지막으로 Unicode 문자열에서 단순한 raw 문자열로 되돌릴 수 있는 신뢰할 수 있는 방법이 있을까요?

  • 로 시스템 및되어 있는 는 UTF-8로 설정됩니다.u''말말 뭘? ???

실제로 " 스트링"은 없습니다; 원 스트링 리터럴이 있습니다. 이것은 정확히 스트링 리터럴로 표시된 스트링 리터럴입니다.'r'첫 번째 인용문 앞에

reteral리터럴의 이 구문에서는 "raw string reteral"이 됩니다.여기서 백슬래시는\ 「하는 것으로 그의 경우는 행, 「 시퀀스는 없습니다. 「백슬래시 시퀀스」는 없습니다.새로운 행, 탭, 백스페이스, 폼 스패이스를 나타내는 「백슬래시」는 없습니다.통상의 스트링 리터럴에서는, 이스케이프 시퀀스의 개시로서 받아들여지지 않게, 각 백슬래시를 2배로 할 필요가 있습니다.

이 구문 변형은 주로 정규 표현 패턴의 구문이 백슬래시로 무거워지기 때문에(단, 끝은 중요하지 않기 때문에 위의 "except" 절은 중요하지 않습니다), 각각의 구문이 이중화되지 않도록 하는 것이 좋습니다.그것뿐입니다.또한 네이티브 Windows 파일 경로(다른 플랫폼과 같이 일반 슬래시 대신 백슬래시 포함)를 표현하는 것도 인기를 끌었지만, 이는 매우 드물게(일반 슬래시는 Windows에서도 정상적으로 동작하기 때문에) 그리고 불완전합니다(위의 "except" 조항 때문에).

r'...' 2 의 ), " " " " (Python 2.*)" 입니다.ur'...' 2이며, 그 Unicode " (Python 2))을 합니다.*)이며, 다른 3종류의 견적도 모두 동일한 유형의 문자열을 생성합니다(예를 들어,r'...',r'''...''',r"...",r"""..."""」를 참조해 주세요.

'돌아가다'는 것은 무엇을 의미하는지 잘 모르겠습니다.원래 문자열 타입은 없기 때문에 완전히 정상적인 문자열 객체, 바이트 또는 유니코드를 그대로 표현하기 위한 대체 구문일 뿐입니다.

, Python 2 python, Python * 서 *u'...' 물론 항상 구별된다'...' 문자열입니다 「알겠습니다」, 「알겠습니다」, 「알겠습니다」.리터럴의 부호화는 완전히 직교적인 문제입니다.

예: (Python 2.6):

>>> sys.getsizeof('ciao')
28
>>> sys.getsizeof(u'ciao')
34

물론 Unicode 개체는 메모리 공간을 더 많이 사용합니다(매우 짧은 문자열에 대한 매우 작은 차이, 분명히;-).

두 : 인 비단뱀입니다: 비단뱀.str 및 "" " " " " " 입니다.unicode 문자열 하지 않고 .u 것이 str하는 타입으로, 8비트 문자를 합니다.u 것이 unicode모든 유니코드 문자를 저장할 수 있는 유형입니다.

r타입은 전혀 변경되지 않습니다.문자열 리터럴의 해석 방법만 변경됩니다.r는 이스케이프 r 문자 그대로 됩니다.어느 쪽이든 유형은 동일합니다.

ur는 물론 백슬래시가 이스케이프 코드의 일부가 아닌 문자 그대로 백슬래시인 Unicode 문자열입니다.

하려면 Unicode 문자열을 합니다.str()그러나 이전 문자열에서 나타낼 수 없는 유니코드 문자가 있으면 예외가 발생합니다.원하는 경우 먼저 물음표로 대체할 수 있지만, 이 경우 해당 문자를 읽을 수 없습니다. 방법은 하지 않는 것이 .str유니코드 문자를 올바르게 처리하려면 를 입력합니다.

'raw string'은 표시되는 대로 저장됨을 의미합니다.예를들면,'\'탈출이 아니라 백슬래시일 뿐이에요

간단하게 설명하겠습니다.python 2 에서는, 2 종류의 다른 문자열을 보존할 수 있습니다.

첫 번째는 ASCII로 python으로 str 타입으로 1바이트의 메모리를 사용합니다(256자, 대부분 영문 알파벳과 간단한 기호를 저장합니다).

번째 유형은 UNICODE로, Python의 Unicode 유형입니다.유니코드에는 모든 유형의 언어가 저장됩니다.

기본적으로는 python은 str 타입을 선호하지만 문자열을 유니코드 타입으로 저장하려면 u'text'처럼 텍스트 앞에 u를 놓거나 유니코드('text')를 호출하여 이 작업을 수행할 수 있습니다.

따라서 u는 함수를 호출하여 str을 유니코드에 캐스트하는 간단한 방법입니다.바로 그거야!

여기서 r 부분을 텍스트 앞에 배치하여 텍스트가 원시 텍스트임을 컴퓨터에 알립니다.백슬래시는 이스케이프 문자가 되어서는 안 됩니다.r'\n'은 새 행 문자를 생성하지 않습니다.그냥 두 글자로 된 일반 텍스트입니다.

str을 유니코드변환하고 여기에 원시 텍스트를 넣으려면 ur를 사용하십시오. ru가 오류를 발생시키므로.

자, 중요한 부분:

r을 사용하여 하나의 백슬래시를 저장할 수 없습니다.이것은 유일한 예외입니다.따라서 이 코드는 오류를 생성합니다: r'\'

백슬래시(하나만)를 저장하려면 '\\'를 사용해야 합니다.

여러 문자를 저장할 경우 r like r'\'사용할 수 있습니다.예상대로 2개의 백슬래시가 생성됩니다.

r이 하나의 백슬래시 스토리지에서 동작하지 않는 이유는 알 수 없지만 그 이유는 아직 누구에게도 설명되지 않았습니다.나는 그것이 벌레였으면 좋겠다.

"u" 접두사는 값에 유형이 있음을 나타냅니다.unicode보다는str.

raw 문자열 리터럴(프리픽스 「r」)은, 그 안에 있는 이스케이프 시퀀스를 이스케이프 합니다.len(r"\n")는 2. 이스케이프 시퀀스가 있기 때문에 단일 백슬래시로 문자열 리터럴을 끝낼 수 없습니다.이것은 유효한 이스케이프 시퀀스가 아닙니다(예:r"\").

"원시"는 그 유형의 일부가 아니라 가치를 나타내는 한 가지 방법일 뿐입니다.예를들면,"\\n"그리고.r"\n"같은 값이다.32,0x20,그리고.0b100000동일합니다.

Unicode 원시 문자열 리터럴을 사용할 수 있습니다.

>>> u = ur"\n"
>>> print type(u), len(u)
<type 'unicode'> 2

소스 파일 인코딩은 소스 파일을 해석하는 방법만 결정합니다. 그렇지 않으면 식이나 유형에 영향을 주지 않습니다.단, ASCII 이외의 인코딩으로 의미가 바뀌는 코드는 피하는 것이 좋습니다.

ASCII(또는 Python 3.0의 경우 UTF-8)를 사용하는 파일에는 코딩 쿠키를 사용할 수 없습니다.Latin-1(또는 UTF-8)은 주석 또는 문서 문자열이 Latin-1을 필요로 하는 작성자 이름을 언급해야 할 경우에만 사용해야 합니다.그렇지 않으면 \x, \u 또는 \U 이스케이프를 사용하여 문자열 리터럴에 ASCII 이외의 데이터를 포함시키는 것이 좋습니다.

유니코드 문자열 리터럴

Unicode 문자열 리터럴(문자열 리터럴 앞에 붙임)u)는 Python 3에서는 사용되지 않게 되었습니다.아직 유효하지만 Python 2와의 호환성 목적으로만 사용할 수 있습니다.

원시 문자열 리터럴

영문자나 숫자와 같이 쉽게 입력할 수 있는 문자로만 구성된 문자열 리터럴을 작성하려면 다음과 같이 입력합니다.'hello world'하지만 좀 더 이국적인 캐릭터도 포함시키려면 몇 가지 회피책을 사용해야 합니다.회피책 중 하나는 이스케이프 시퀀스입니다.예를 들어 입력하기 쉬운 두 개의 문자를 추가하는 것만으로 문자열의 새로운 행을 나타낼 수 있습니다.\n문자열 리터럴로 이동합니다.그래서 프린트 할 때'hello\nworld'문자열, 단어는 다른 행으로 인쇄됩니다.아주 편리하네요!

한편, 이스케이프 시퀀스를 포함한 문자열 리터럴을 만들고 싶지만 Python에 의해 해석되지 않는 경우도 있습니다.날것으로 만들고 싶군요.다음의 예를 참조해 주세요.

'New updates are ready in c:\windows\updates\new'
'In this lesson we will learn what the \n escape sequence does.'

이러한 상황에서는 스트링 리터럴에 prefix를 붙이면 됩니다.r다음과 같은 문자:r'hello\nworld'탈출 시퀀스는 Python에 의해 해석되지 않습니다.문자열은 작성한 그대로 인쇄됩니다.

생현 리터럴은 완전히 생현 리터럴이 아닙니다.

많은 사람들은 "따옴표 사이에 있는 모든 은 Python에 의해 무시된다"는 의미에서 원시 문자열 리터럴을 기대합니다.그건 사실이 아니에요.Python은 여전히 모든 이스케이프 시퀀스를 인식하지만 해석은 하지 않고 그대로 둔다., 원시 문자열 리터럴은 여전히 유효한 문자열 리터럴이어야 합니다.

문자열 리터럴의 어휘적 정의:

string     ::=  "'" stringitem* "'"
stringitem ::=  stringchar | escapeseq
stringchar ::=  <any source character except "\" or newline or the quote>
escapeseq  ::=  "\" <any source character>

스트링 리터럴(원시 또는 미가공)에 맨따옴표 문자가 포함되어 있는 것은 분명합니다.'hello'world'또는 백슬래시로 끝납니다.'hello world\'유효하지 않습니다.

이것은 명백할 수도 있고 아닐 수도 있지만, x=squ(92)를 호출하면 문자열 '\'을 만들 수 있습니다.

x=chr(92)
print type(x), len(x) # <type 'str'> 1
y='\\'
print type(y), len(y) # <type 'str'> 1
x==y   # True
x is y # False

언급URL : https://stackoverflow.com/questions/2081640/what-exactly-do-u-and-r-string-prefixes-do-and-what-are-raw-string-literals