Ponieważ \
rozpoczynaj sekwencje specjalne tylko wtedy, gdy są poprawnymi sekwencjami ucieczki.
>>> '\n'
'\n'
>>> r'\n'
'\\n'
>>> print '\n'
>>> print r'\n'
\n
>>> '\s'
'\\s'
>>> r'\s'
'\\s'
>>> print '\s'
\s
>>> print r'\s'
\s
O ile nie ma przedrostka „r” lub „R”, sekwencje specjalne w łańcuchach są interpretowane zgodnie z regułami podobnymi do reguł stosowanych w standardzie C. Rozpoznawane sekwencje specjalne to:
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
Nigdy nie polegaj na surowych ciągach dla literałów ścieżki, ponieważ surowe ciągi mają pewne dość osobliwe wewnętrzne mechanizmy, o których wiadomo, że ugryzły ludzi w tyłek:
Gdy obecny jest przedrostek „r” lub „R”, znak następujący po ukośniku odwrotnym jest zawarty w ciągu bez zmiany, a wszystkie ukośniki odwrotne pozostają w ciągu. Na przykład, literał ciągu r"\n"
składa się z dwóch znaków: ukośnika odwrotnego i małej litery „n”. Cudzysłowy łańcuchowe mogą być poprzedzone ukośnikiem odwrotnym, ale ukośnik odwrotny pozostaje w ciągu; na przykład r"\""
jest prawidłowym literałem ciągu składającym się z dwóch znaków: ukośnika odwrotnego i cudzysłowu; r"\"
nie jest prawidłowym literałem ciągu (nawet nieprzetworzony ciąg nie może kończyć się nieparzystą liczbą odwrotnych ukośników). Konkretnie, nieprzetworzony ciąg nie może kończyć się pojedynczym ukośnikiem odwrotnym (ponieważ ukośnik odwrotny mógłby uciec od następującego cudzysłowu). Zauważ również, że pojedynczy lewy ukośnik, po którym następuje nowa linia, jest interpretowany jako te dwa znaki jako część ciągu,
Aby lepiej zilustrować ten ostatni punkt:
>>> 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 '\\'
\
'\s'
(liker'\s'
) jest również reprezentowany jako'\\s'
, ponieważ'\s'
nie jest rozpoznawaną sekwencją ucieczki.„r” oznacza „nieprzetworzony ciąg znaków”, tj. Znaki z ukośnikiem odwrotnym są traktowane dosłownie, zamiast oznaczać specjalne traktowanie następującego znaku.
http://docs.python.org/reference/lexical_analysis.html#literals
więc
'\n'
jest pojedynczym znakiem nowej liniii
r'\n'
składa się z dwóch znaków - ukośnika odwrotnego i litery 'n'innym sposobem zapisania tego byłoby to,
'\\n'
że pierwszy ukośnik odwrotny zastępuje drugirównoważny sposób pisania tego
print (re.sub(r'(\b\w+)(\s+\1\b)+', r'\1', 'hello there there'))
jest
print (re.sub('(\\b\\w+)(\\s+\\1\\b)+', '\\1', 'hello there there'))
Ze względu na sposób, w jaki Python traktuje znaki, które nie są prawidłowymi znakami ucieczki, nie wszystkie te podwójne ukośniki odwrotne są konieczne - np.
'\s'=='\\s'
Jednak to samo nie dotyczy'\b'
i'\\b'
. Wolę być wyraźny i podwoić wszystkie ukośniki.źródło
Nie wszystkie sekwencje zawierające ukośniki odwrotne są sekwencjami ucieczki.
\t
i\f
są na przykład, ale\s
nie są. W nie surowym literale łańcuchowym każdy\
element , który nie jest częścią sekwencji ucieczki, jest postrzegany jako po prostu kolejny\
:>>> "\s" '\\s' >>> "\t" '\t'
\b
jest sekwencją ucieczki, więc przykład 3 zawodzi. (I tak, niektórzy uważają to zachowanie za raczej niefortunne).źródło
r
nadal wymyka niektóre sekwencje, gdy pojawiają się na końcu łańcucha:r"\"
jest niepoprawne, aby to zrobić, musisz to zrobić"\\"
. Jeśli takr"\\"
, otrzymasz\\
wydrukowany ("\\\\"
ciąg). Uważaj z tym.Spróbuj tego:
a = '\'' ' a = r'\'' \' a = "\'" ' a = r"\'" \'
źródło
Sprawdź poniższy przykład:
print r"123\n123" #outputs>>> 123\n123 print "123\n123" #outputs>>> 123 123
źródło