'...'
, "..."
En Python, si vous préfixez ces littéraux de chaîne par l'un des caractères suivants, la valeur deviendra une chaîne sans expansion de la séquence d'échappement.
r
R
Utile pour traiter les chaînes de caractères qui utilisent beaucoup de barres obliques inversées, comme les chemins d'accès Windows et les modèles d'expression régulière.
Les informations suivantes sont fournies ici.
- séquence d'échappement
- Ignorer (désactiver) les séquences d'échappement dans les chaînes brutes
- Convertir une chaîne normale en chaîne brute:
repr()
- Notez la barre oblique inversée à la fin.
séquence d'échappement
En Python, les caractères qui ne peuvent pas être représentés dans une chaîne de caractères normale (comme les tabulations et les nouvelles lignes) sont décrits à l'aide de séquences d'échappement avec des antislashes, comme dans le langage C. Un exemple de séquence d'échappement est présenté ci-dessous.
\t
\n
s = 'a\tb\nA\tB'
print(s)
# a b
# A B
Ignorer (désactiver) les séquences d'échappement dans les chaînes brutes
'...'
, "..."
Si vous préfixez un tel littéral de chaîne par l'un des éléments suivants, la valeur deviendra une chaîne sans expansion de la séquence d'échappement. Une telle chaîne est appelée chaîne brute.
r
R
rs = r'a\tb\nA\tB'
print(rs)
# a\tb\nA\tB
Il n'existe pas de type spécial appelé type de chaîne brute, il s'agit simplement d'un type de chaîne et il est égal à une chaîne normale avec une barre oblique inversée représentée comme suit\\
print(type(rs))
# <class 'str'>
print(rs == 'a\\tb\\nA\\tB')
# True
Dans une chaîne normale, une séquence d'échappement est considérée comme un caractère, mais dans une chaîne brute, les barres obliques inversées sont également comptées comme des caractères. La longueur de la chaîne et de chaque caractère est la suivante.
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']
Chemin de Windows
L'utilisation de la chaîne brute est utile lorsque vous souhaitez représenter un chemin d'accès Windows sous forme de chaîne.
Les chemins d'accès de Windows sont séparés par des barres obliques inversées, donc si vous utilisez une chaîne normale, vous devez échapper le chemin d'accès comme suit, mais si vous utilisez une chaîne brute, vous pouvez l'écrire telle quelle. Les valeurs sont équivalentes.\\
path = 'C:\\Windows\\system32\\cmd.exe'
rpath = r'C:\Windows\system32\cmd.exe'
print(path == rpath)
# True
Notez qu'une chaîne se terminant par un nombre impair de barres obliques inversées entraînera une erreur, comme décrit ci-dessous. Dans ce cas, il est nécessaire d'écrire la chaîne comme une chaîne normale, ou de la concaténer en écrivant seulement la fin de la chaîne comme une chaîne normale.
path2 = 'C:\\Windows\\system32\\'
# rpath2 = r'C:\Windows\system32\'
# SyntaxError: EOL while scanning string literal
rpath2 = r'C:\Windows\system32' + '\\'
print(path2 == rpath2)
# True
Convertir des chaînes normales en chaînes brutes avec repr()
Si vous voulez convertir une chaîne normale en une chaîne brute en ignorant (désactivant) les séquences d'échappement, vous pouvez utiliser la fonction intégrée repr().
s_r = repr(s)
print(s_r)
# 'a\tb\nA\tB'
Ce que repr() renvoie est une chaîne représentant un objet tel qu'il a la même valeur que lorsqu'il a été passé à eval(), avec les caractères de tête et de queue.
print(list(s_r))
# ["'", 'a', '\\', 't', 'b', '\\', 'n', 'A', '\\', 't', 'B', "'"]
En utilisant les tranches, nous pouvons obtenir une chaîne équivalente à la chaîne brute avec r attaché.
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
Notez la barre oblique inversée à la fin.
Étant donné qu'une barre oblique inversée permet d'échapper au caractère de citation qui la suit immédiatement, une erreur se produira s'il y a un nombre impair de barres obliques inversées à la fin de la chaîne. Un nombre pair de barres obliques inversées est acceptable.
# print(r'\')
# SyntaxError: EOL while scanning string literal
print(r'\\')
# \\
# print(r'\\\')
# SyntaxError: EOL while scanning string literal