'...'
, "..."
Στην Python, αν προτάξετε αυτά τα αλφαριθμητικά με έναν από τους ακόλουθους χαρακτήρες, η τιμή θα γίνει αλφαριθμητικό χωρίς να επεκτείνετε την ακολουθία διαφυγής.
r
R
Χρήσιμο όταν πρόκειται για συμβολοσειρές που χρησιμοποιούν πολλές backslashes, όπως οι διαδρομές των Windows και τα μοτίβα κανονικών εκφράσεων.
Οι ακόλουθες πληροφορίες παρέχονται εδώ.
- ακολουθία διαφυγής
- Αγνόηση (απενεργοποίηση) ακολουθιών διαφυγής σε ακατέργαστες συμβολοσειρές
- Μετατροπή κανονικής συμβολοσειράς σε ακατέργαστη συμβολοσειρά:
repr()
- Προσέξτε τον backslash στο τέλος.
ακολουθία διαφυγής
Στην Python, οι χαρακτήρες που δεν μπορούν να αναπαρασταθούν σε μια κανονική συμβολοσειρά (όπως οι ταμπέλες και οι γραμμές αλλαγής) περιγράφονται με τη χρήση ακολουθιών διαφυγής με backslashes, παρόμοια με τη γλώσσα C. Ένα παράδειγμα μιας ακολουθίας διαφυγής παρουσιάζεται παρακάτω.
\t
\n
s = 'a\tb\nA\tB'
print(s)
# a b
# A B
Αγνόηση (απενεργοποίηση) ακολουθιών διαφυγής σε ακατέργαστες συμβολοσειρές
'...'
, "..."
Αν προτάξετε ένα τέτοιο αλφαριθμητικό με ένα από τα παρακάτω, η τιμή θα γίνει αλφαριθμητικό χωρίς να επεκτείνετε την ακολουθία διαφυγής. Ένα τέτοιο αλφαριθμητικό ονομάζεται ακατέργαστο αλφαριθμητικό.
r
R
rs = r'a\tb\nA\tB'
print(rs)
# a\tb\nA\tB
Δεν υπάρχει ειδικός τύπος που ονομάζεται raw string type, είναι απλά ένας τύπος συμβολοσειράς και είναι ίσος με μια κανονική συμβολοσειρά με backslash που αναπαρίσταται ως εξής\\
print(type(rs))
# <class 'str'>
print(rs == 'a\\tb\\nA\\tB')
# True
Σε μια κανονική συμβολοσειρά, μια ακολουθία διαφυγής θεωρείται ένας χαρακτήρας, αλλά σε μια ακατέργαστη συμβολοσειρά, οι backslashes υπολογίζονται επίσης ως χαρακτήρες. Το μήκος της συμβολοσειράς και κάθε χαρακτήρα έχει ως εξής.
print(len(s))
# 7
print(list(s))
# ['a', '\t', 'b', '\n', 'A', '\t', 'B']
print(len(rs))
# 10
print(list(rs))
# ['a', '\\', 't', 'b', '\\', 'n', 'A', '\\', 't', 'B']
Διαδρομή των Windows
Η χρήση της ακατέργαστης συμβολοσειράς είναι χρήσιμη όταν θέλετε να αναπαραστήσετε μια διαδρομή των Windows ως συμβολοσειρά.
Οι διαδρομές των Windows διαχωρίζονται με backslashes, οπότε αν χρησιμοποιείτε μια κανονική συμβολοσειρά, πρέπει να αποφύγετε τη διαδρομή ως εξής, αλλά αν χρησιμοποιείτε μια ακατέργαστη συμβολοσειρά, μπορείτε να τη γράψετε ως έχει. Οι τιμές είναι ισοδύναμες.\\
path = 'C:\\Windows\\system32\\cmd.exe'
rpath = r'C:\Windows\system32\cmd.exe'
print(path == rpath)
# True
Σημειώστε ότι μια συμβολοσειρά που τελειώνει με περιττό αριθμό backslashes θα οδηγήσει σε σφάλμα, όπως περιγράφεται παρακάτω. Σε αυτή την περίπτωση, είναι απαραίτητο να γράψετε τη συμβολοσειρά ως κανονική συμβολοσειρά ή να τη συνθέσετε γράφοντας μόνο το τέλος της συμβολοσειράς ως κανονική συμβολοσειρά.
path2 = 'C:\\Windows\\system32\\'
# rpath2 = r'C:\Windows\system32\'
# SyntaxError: EOL while scanning string literal
rpath2 = r'C:\Windows\system32' + '\\'
print(path2 == rpath2)
# True
Μετατροπή κανονικών συμβολοσειρών σε ακατέργαστες συμβολοσειρές με την repr()
Αν θέλετε να μετατρέψετε ένα κανονικό αλφαριθμητικό σε ένα ακατέργαστο αλφαριθμητικό αγνοώντας (απενεργοποιώντας) τις ακολουθίες διαφυγής, μπορείτε να χρησιμοποιήσετε την ενσωματωμένη συνάρτηση repr().
s_r = repr(s)
print(s_r)
# 'a\tb\nA\tB'
Αυτό που επιστρέφει η repr() είναι ένα αλφαριθμητικό που αναπαριστά ένα αντικείμενο, έτσι ώστε να έχει την ίδια τιμή όπως όταν πέρασε στην eval(), με πρώτους και τελευταίους χαρακτήρες.
print(list(s_r))
# ["'", 'a', '\\', 't', 'b', '\\', 'n', 'A', '\\', 't', 'B', "'"]
Χρησιμοποιώντας slices, μπορούμε να πάρουμε μια συμβολοσειρά ισοδύναμη με την ακατέργαστη συμβολοσειρά με επισυναπτόμενο r.
s_r2 = repr(s)[1:-1]
print(s_r2)
# a\tb\nA\tB
print(s_r2 == rs)
# True
print(r'\t' == repr('\t')[1:-1])
# True
Προσέξτε τον backslash στο τέλος.
Δεδομένου ότι μια backslash διαφεύγει του χαρακτήρα παράθεσης αμέσως μετά από αυτήν, θα προκύψει σφάλμα αν υπάρχει περιττός αριθμός backslashes στο τέλος της συμβολοσειράς. Ένας ζυγός αριθμός backslashes είναι ΟΚ.
# print(r'\')
# SyntaxError: EOL while scanning string literal
print(r'\\')
# \\
# print(r'\\\')
# SyntaxError: EOL while scanning string literal