Tak naprawdę nie ma „surowego ciągu ”; istnieją surowe literały łańcuchowe , które są dokładnie literałami łańcuchowymi oznaczonymi 'r'
przed cudzysłowiem otwierającym.
„Nieprzetworzony dosłowny ciąg znaków” to nieco inna składnia dla dosłownego ciągu znaków, w którym odwrotny ukośnik \
jest traktowany jako „tylko odwrotny ukośnik” (z wyjątkiem sytuacji, gdy pojawia się tuż przed cytatem, który w przeciwnym razie zakończyłby dosłowność) - nie „sekwencje specjalne” reprezentujące znaki nowego wiersza, tabulatory, spacje, feed-form i tak dalej. W normalnych literałach łańcuchowych każdy odwrotny ukośnik musi zostać podwojony, aby uniknąć wzięcia go za początek sekwencji ucieczki.
Ten wariant składni istnieje głównie dlatego, że składnia wzorców wyrażeń regularnych jest obciążona odwrotnymi ukośnikami (ale nigdy na końcu, więc powyższa klauzula „oprócz” nie ma znaczenia) i wygląda nieco lepiej, gdy unikasz podwojenia każdego z nich - - to wszystko. Zyskał również pewną popularność do wyrażania natywnych ścieżek plików systemu Windows (z ukośnikami odwrotnymi zamiast zwykłych ukośników, takich jak na innych platformach), ale jest to bardzo rzadko potrzebne (ponieważ normalne ukośniki działają również dobrze w systemie Windows) i niedoskonałe (z powodu klauzuli „oprócz” powyżej).
r'...'
jest ciągiem bajtów (w Pythonie 2. *) ur'...'
jest ciągiem znaków Unicode (ponownie, w Pythonie 2. *), a każdy z pozostałych trzech rodzajów cytując produkuje także dokładnie te same rodzaje strun (tak na przykład r'...'
, r'''...'''
, r"..."
, r"""..."""
są ciągami bajtów itd.).
Nie jestem pewien, co rozumiesz przez „ cofanie się ” - nie ma wewnętrznych wskazówek do przodu i do tyłu, ponieważ nie ma surowego typu łańcucha , jest to po prostu alternatywna składnia do wyrażania idealnie normalnych obiektów łańcucha, bajtów lub Unicode.
I tak, w Pythonie 2. *, u'...'
jest oczywiście zawsze różni się od właśnie '...'
- były to ciąg Unicode, ten ostatni jest ciągiem bajtów. To, co może być wyrażone w literale, jest kwestią całkowicie ortogonalną.
Np. Rozważ (Python 2.6):
>>> sys.getsizeof('ciao')
28
>>> sys.getsizeof(u'ciao')
34
Obiekt Unicode zajmuje oczywiście więcej miejsca w pamięci (oczywiście niewielka różnica w przypadku bardzo krótkiego łańcucha; oczywiście ;-).
u
ir
nie są przemienne:ur'str'
działa,ru'str'
nie. (przynajmniej w ipython 2.7.2 na win7)r
ciągi i zauważyłem, że jeśli\
jest ostatnim znakiem, nie będzie traktowany jako dosłowny, ale zamiast tego wymyka się cudzysłowowi, powodującSyntaxError: EOL while scanning string literal
. Tak więc\\
nadal musi być użyty do ostatniej instancji\
dowolnego łańcucha zakończonego odwrotnym ukośnikiem.sys.getsizeof('cioa') == sys.getsizeof(r'cioa') == sys.getsizeof(u'cioa')
(Ubuntu 16.04 z językiem UTF8). Podobnietype('cioa') == type(r'cioa') == type(u'cioa')
. ALE interpolacja łańcuchów surowych robi różnicę, więcsys.getsizeof('\ncioa') == sys.getsizeof(u'\ncioa') != sys.getsizeof(r'\ncioa')
W Pythonie istnieją dwa typy ciągów: tradycyjny
str
i nowszyunicode
. Jeśli wpiszesz literał ciąg bez znaku zu
przodu, otrzymasz starystr
typ, który przechowuje znaki 8-bitowe, a zu
przodu otrzymasz nowszyunicode
typ, który może przechowywać dowolny znak Unicode.W
r
ogóle nie zmienia typu, zmienia jedynie interpretację literału łańcuchowego. Bezr
ukośników odwrotnych są traktowane jako znaki specjalne. Zr
odwrotnymi ukośnikami są traktowane jako dosłowne. Tak czy inaczej, typ jest taki sam.ur
jest oczywiście łańcuchem Unicode, w którym odwrotne ukośniki są dosłowne odwrotnymi ukośnikami, a nie częścią kodów specjalnych.Możesz spróbować przekonwertować ciąg Unicode na stary, używając tej
str()
funkcji, ale jeśli istnieją znaki Unicode, których nie można reprezentować w starym ciągu, otrzymasz wyjątek. Jeśli chcesz, możesz najpierw zastąpić je znakami zapytania, ale oczywiście spowoduje to, że te postacie będą nieczytelne. Nie zaleca się używania tegostr
typu, jeśli chcesz poprawnie obsługiwać znaki Unicode.źródło
r"\"
występuje błąd składniowy.„nieprzetworzony ciąg” oznacza, że jest przechowywany tak, jak się wydaje. Na przykład
'\'
jest tylko odwrotnym ukośnikiem zamiast ucieczki .źródło
Prefiks „u” oznacza, że wartość ma typ,
unicode
a nie typstr
.Nieprzetworzone literały łańcuchowe z prefiksem „r” unikają wszelkich zawartych w nich sekwencji ucieczki, podobnie jak
len(r"\n")
2. Ponieważ są to sekwencje specjalne, nie można kończyć literału łańcucha pojedynczym odwrotnym ukośnikiem: to nie jest poprawna sekwencja Escape (npr"\"
.).„Surowe” nie jest częścią tego typu, jest tylko jednym ze sposobów przedstawienia wartości. Na przykład,
"\\n"
ir"\n"
są identyczne wartości, podobnie jak32
,0x20
i0b100000
są identyczne.Możesz mieć nieprzetworzone dosłowne ciągi literałów:
Kodowanie pliku źródłowego określa tylko sposób interpretacji pliku źródłowego, nie wpływa to w żaden sposób na wyrażenia ani typy. Jednakże, jest to zalecane , aby uniknąć kod gdzie kodowanie inne niż ASCII zmieniłoby znaczenie:
źródło
Pozwól, że wyjaśnię to po prostu: w Pythonie 2 możesz przechowywać ciąg znaków w 2 różnych typach.
Pierwszym z nich jest ASCII, który jest typu str w pythonie, wykorzystuje 1 bajt pamięci. (256 znaków, będzie przechowywać głównie angielskie alfabety i proste symbole)
Drugi typ to UNICODE, który jest typem Unicode w python. Unicode przechowuje wszystkie typy języków.
Domyślnie Python preferuje typ str, ale jeśli chcesz przechowywać ciąg w typie Unicode , możesz umieścić u przed tekstem, np. U'text, lub możesz to zrobić, wywołując Unicode („tekst”)
Więc u jest tylko krótki sposób, aby wywołać funkcję, aby rzutować str na Unicode . Otóż to!
Teraz część r , umieszczasz przed tekstem, aby poinformować komputer, że tekst jest tekstem surowym, ukośnik odwrotny nie powinien być znakiem ucieczki. r '\ n' nie utworzy nowego znaku linii. To tylko zwykły tekst zawierający 2 znaki.
Jeśli chcesz przekonwertować str na Unicode, a także wstawić tam nieprzetworzony tekst, użyj ur, ponieważ ru spowoduje błąd.
TERAZ ważna część:
Nie można zapisać jednego ukośnika odwrotnego za pomocą r , to jedyny wyjątek. Więc ten kod spowoduje błąd: r '\'
Aby zapisać ukośnik odwrotny (tylko jeden), musisz użyć „\\”
Jeśli chcesz przechowywać więcej niż 1 znaków można nadal korzystać z R jak r „\\” będzie produkować 2 backslashy jak oczekiwano.
Nie znam powodu, dla którego r nie działa z jednym magazynem ukośnika odwrotnego, ale powód nie jest jeszcze opisany przez nikogo. Mam nadzieję, że to błąd.
źródło
r'\'
jest to nielegalne, nie możesz nawet postawić ani jednego'\'
ogona. Podobnie jakr'xxxxxx\'
nielegalny ciąg.str
. Przeczytaj więcej dla lepszego zrozumienia tutaj: medium.com/better-programming/…Może to oczywiste, może nie, ale możesz zrobić ciąg „\” , wywołując x = chr (92)
źródło
x is y
ocenia na True w python3?x is y
tak się dziejeTrue
z internowaniem. Zamiast tego użyjx == y
(jeśli nie sprawdzasz, czy xiy są dokładnie tym samym obiektem przechowywanym w jednej pozycji pamięci, to znaczy).Literały łańcuchowe Unicode
Literały ciągów Unicode (literały ciągów z prefiksem
u
) nie są już używane w Pythonie 3. Są one nadal aktualne, ale wyłącznie w celu zachowania zgodności z Pythonem 2.Surowe literały łańcuchowe
Jeśli chcesz utworzyć ciąg składający się tylko z literalną łatwo oznaczalnych izolatów znaków takich jak angielskich liter lub cyfr, można po prostu wpisać je:
'hello world'
. Ale jeśli chcesz dołączyć także bardziej egzotyczne postacie, musisz użyć obejścia. Jednym z obejść są sekwencje specjalne . W ten sposób możesz na przykład reprezentować nowy wiersz w łańcuchu, po prostu dodając dwa łatwe do wpisania znaki\n
do literału łańcucha. Kiedy więc wydrukujesz'hello\nworld'
ciąg, słowa zostaną wydrukowane w osobnych wierszach. To bardzo przydatne!Z drugiej strony istnieją sytuacje, w których chcesz utworzyć literał łańcuchowy zawierający sekwencje specjalne, ale nie chcesz, aby były one interpretowane przez Python. Chcesz, żeby były surowe . Spójrz na te przykłady:
W takich sytuacjach możesz po prostu poprzedzić literał ciągiem
r
znakiem takim jak ten:r'hello\nworld'
i żadne sekwencje specjalne nie będą interpretowane przez Python. Ciąg zostanie wydrukowany dokładnie tak, jak go utworzyłeś.Surowe literały łańcuchowe nie są całkowicie „surowe”?
Wiele osób oczekuje, że surowe literały łańcuchowe będą surowe w tym sensie, że „wszystko umieszczone między cudzysłowami jest ignorowane przez Python” . To nie jest prawda. Python nadal rozpoznaje wszystkie sekwencje specjalne, po prostu ich nie interpretuje - zamiast tego pozostawia je niezmienione. Oznacza to, że nieprzetworzone literały łańcuchowe wciąż muszą być poprawnymi literałami łańcuchowymi .
Z leksykalnej definicji literału łańcuchowego:
Oczywiste jest, że literały łańcuchowe (nieprzetworzone lub nie) zawierające czysty znak cudzysłowu:
'hello'world'
lub kończące się odwrotnym ukośnikiem:'hello world\'
są nieprawidłowe.źródło