[python] Python 정규식-R 접두사

r접두사가 사용되지 않을 때 아래 예제 1이 작동하는 이유를 누구든지 설명 할 수 있습니까 ? r이스케이프 시퀀스를 사용할 때마다 접두사를 사용해야 한다고 생각했습니다 . 예제 2와 예제 3이이를 보여줍니다.

# example 1
import re
print (re.sub('\s+', ' ', 'hello     there      there'))
# prints 'hello there there' - not expected as r prefix is not used

# example 2
import re
print (re.sub(r'(\b\w+)(\s+\1\b)+', r'\1', 'hello     there      there'))
# prints 'hello     there' - as expected as r prefix is used

# example 3
import re
print (re.sub('(\b\w+)(\s+\1\b)+', '\1', 'hello     there      there'))
# prints 'hello     there      there' - as expected as r prefix is not used



답변

때문에 \그들은 유효한 이스케이프 시퀀스 경우에만 이스케이프 시퀀스를 시작합니다.

>>> '\n'
'\n'
>>> r'\n'
'\\n'
>>> print '\n'


>>> print r'\n'
\n
>>> '\s'
'\\s'
>>> r'\s'
'\\s'
>>> print '\s'
\s
>>> print r'\s'
\s

아니라면 에 ‘R’또는 ‘R’프리픽스가 존재, 서열 탈출 이스케이프 시퀀스가 인식 표준 C. 의해 사용되는 것과 유사한 규칙에 따라 해석하여 문자열 :

Escape Sequence   Meaning Notes
\newline  Ignored
\\    Backslash (\)
\'    Single quote (')
\"    Double quote (")
\a    ASCII Bell (BEL)
\b    ASCII Backspace (BS)
\f    ASCII Formfeed (FF)
\n    ASCII Linefeed (LF)
\N{name}  Character named name in the Unicode database (Unicode only)
\r    ASCII Carriage Return (CR)
\t    ASCII Horizontal Tab (TAB)
\uxxxx    Character with 16-bit hex value xxxx (Unicode only)
\Uxxxxxxxx    Character with 32-bit hex value xxxxxxxx (Unicode only)
\v    ASCII Vertical Tab (VT)
\ooo  Character with octal value ooo
\xhh  Character with hex value hh

경로 리터럴에 대해 원시 문자열에 의존하지 마십시오. 원시 문자열 에는 엉덩이에 사람을 물린 것으로 알려진 다소 특이한 내부 작업이 있습니다.

“r”또는 “R”접두사가있는 경우 백 슬래시 뒤의 문자는 변경없이 문자열에 포함되고 모든 백 슬래시는 문자열에 남습니다. 예를 들어, 문자열 리터럴 r"\n"은 백 슬래시와 소문자 “n”의 두 문자로 구성됩니다. 문자열 따옴표는 백 슬래시로 이스케이프 될 수 있지만 백 슬래시는 문자열에 남아 있습니다. 예를 들어, r"\""백 슬래시와 큰 따옴표의 두 문자로 구성된 유효한 문자열 리터럴입니다. r"\"유효한 문자열 리터럴이 아닙니다 (원시 문자열도 홀수의 백 슬래시로 끝날 수 없음). 특히, 원시 문자열은 단일 백 슬래시로 끝날 수 없습니다 (백 슬래시는 다음 따옴표 문자를 이스케이프하기 때문에). 또한 하나의 백 슬래시와 개행 문자는 문자열의 일부로 두 문자로 해석됩니다.

이 마지막 요점을 더 잘 설명하려면 :

>>> r'\'
SyntaxError: EOL while scanning string literal
>>> r'\''
"\\'"
>>> '\'
SyntaxError: EOL while scanning string literal
>>> '\''
"'"
>>> 
>>> r'\\'
'\\\\'
>>> '\\'
'\\'
>>> print r'\\'
\\
>>> print r'\'
SyntaxError: EOL while scanning string literal
>>> print '\\'
\


답변

‘r’은 다음이 “원시 문자열”임을 의미합니다. 백 슬래시 문자는 다음 문자의 특수 처리를 나타내는 대신 문자 그대로 처리됩니다.

http://docs.python.org/reference/lexical_analysis.html#literals

그래서 '\n'하나의 개행 문자
이고 r'\n'두 문자입니다. 백 슬래시와 문자 ‘n’
을 쓰는 또 다른 방법 '\\n'은 첫 번째 백 슬래시가 두 번째 문자를 이스케이프하기 때문입니다.

이것을 쓰는 동등한 방법

print (re.sub(r'(\b\w+)(\s+\1\b)+', r'\1', 'hello     there      there'))

이다

print (re.sub('(\\b\\w+)(\\s+\\1\\b)+', '\\1', 'hello     there      there'))

파이썬이 유효한 이스케이프 문자가 아닌 문자를 처리하는 방식 때문에 이러한 이중 백 슬래시가 모두 필요한 '\s'=='\\s'것은 아닙니다 . 예를 들어 '\b'및 에서는 동일하지 않습니다 '\\b'. 내 선호는 명시적이고 모든 백 슬래시를 두 배로 늘리는 것입니다.


답변

백 슬래시를 포함하는 모든 시퀀스가 ​​이스케이프 시퀀스 인 것은 아닙니다. \t그리고 \f예를 들어,하지만 \s하지 않습니다. 원시가 아닌 문자열 리터럴에서 \이스케이프 시퀀스의 일부가 아닌 것은 다른 것으로 간주됩니다 \.

>>> "\s"
'\\s'
>>> "\t"
'\t'

\b 실시 예 3에 실패하므로 이스케이프 시퀀스 그러나. (네, 어떤 사람들은이 행동을 오히려 불행하다고 생각합니다.)


답변

시도해보십시오.

a = '\''
'
a = r'\''
\'
a = "\'"
'
a = r"\'"
\'


답변

아래 예를 확인하십시오.

print r"123\n123"
#outputs>>>
123\n123


print "123\n123"
#outputs>>>
123
123


답변