La réponse de Zarkonnen répond à votre question, mais pas directement. Je vais essayer d'être plus direct, et voir si je peux obtenir la prime de Zarkonnen.
Vous comprendrez peut-être plus facilement si vous cessez d'utiliser les termes "raw string regex" et "raw string patterns". Ces termes confondent deux concepts distincts : la représentation d'une chaîne particulière dans le code source Python et l'expression régulière que cette chaîne représente.
En fait, il est utile de les considérer comme deux langages de programmation différents, chacun ayant sa propre syntaxe. Le langage Python possède un code source qui, entre autres choses, construit des chaînes de caractères avec un certain contenu et appelle le système d'expressions régulières. Le système d'expressions régulières possède un code source qui réside dans des objets de type chaîne de caractères et qui fait correspondre des chaînes de caractères. Les deux langages utilisent la barre oblique inverse comme caractère d'échappement.
Tout d'abord, il faut comprendre qu'une chaîne de caractères est une séquence de caractères (c'est-à-dire des octets ou des points de code Unicode ; la distinction n'a pas beaucoup d'importance ici). Il existe de nombreuses façons de représenter une chaîne de caractères dans le code source Python. A chaîne brute est simplement l'une de ces représentations. Si deux représentations aboutissent à la même séquence de caractères, elles produisent un comportement équivalent.
Imaginez une chaîne de 2 caractères, composée de l'élément barre oblique inverse suivi du caractère n caractère. Si vous savez que la valeur du caractère pour barre oblique inverse est de 92, et pour n est 110, alors cette expression génère notre chaîne de caractères :
s = chr(92)+chr(110)
print len(s), s
2 \n
La notation conventionnelle des chaînes de caractères de Python "\n"
ne génère pas cette chaîne. Au lieu de cela, il génère une chaîne d'un caractère avec un caractère de retour à la ligne. La chaîne Documentation Python 2.4.1. Caractères littéraux des chaînes de caractères dire : "La barre oblique inverse (\) est utilisée pour échapper à des caractères qui ont une signification spéciale, tels que la nouvelle ligne, la barre oblique inverse elle-même ou le caractère de citation".
s = "\n"
print len(s), s
1
(Notez que la nouvelle ligne n'est pas visible dans cet exemple, mais si vous regardez attentivement, vous verrez une ligne vide après le "1").
Pour obtenir notre chaîne de deux caractères, nous devons utiliser un autre fichier barre oblique inverse pour échapper à la signification spéciale du caractère d'origine barre oblique inverse caractère :
s = "\\n"
print len(s), s
2 \n
Que faire si l'on veut représenter des chaînes de caractères qui ont plusieurs barre oblique inverse des personnages ? Documentation Python 2.4.1. Caractères littéraux des chaînes de caractères Les chaînes littérales peuvent éventuellement être préfixées par la lettre "r" ou "R" ; ces chaînes sont appelées "chaînes de caractères". chaînes brutes et utilisent des règles différentes pour interpréter les séquences d'échappement backslash". Voici notre chaîne de deux caractères, en utilisant la représentation brute de la chaîne :
s = r"\n"
print len(s), s
2 \n
Nous avons donc trois représentations de chaînes différentes, qui donnent toutes la même chaîne, ou séquence de caractères :
print chr(92)+chr(110) == "\\n" == r"\n"
True
Passons maintenant aux expressions régulières. Les expressions Python docs, 7.2. re
- Opérations sur les expressions régulières dit : "Les expressions régulières utilisent la barre oblique inverse ('\') pour indiquer des formes spéciales ou pour permettre l'utilisation de caractères spéciaux sans invoquer leur signification particulière. Cela entre en conflit avec l'utilisation par Python du même caractère pour la même raison dans les chaînes de caractères littérales..."
Si vous voulez un objet d'expression régulière Python qui corresponde à un caractère de nouvelle ligne, vous avez besoin d'une chaîne de deux caractères, composée de l'expression suivante barre oblique inverse suivi du caractère n caractère. Les lignes de code suivantes définissent toutes prog
à un objet d'expression régulière qui reconnaît un caractère de nouvelle ligne :
prog = re.compile(chr(92)+chr(110))
prog = re.compile("\\n")
prog = re.compile(r"\n")
Comment se fait-il donc que "En général, les motifs sont exprimés dans le code Python à l'aide de cette notation de chaîne brute." ? Parce que les expressions régulières sont souvent des chaînes statiques, qui sont commodément représentées comme des chaînes littérales. Et parmi les différentes notations de chaînes littérales disponibles, les chaînes brutes sont un choix commode, lorsque l'expression rationnelle comprend un élément barre oblique inverse caractère.
Questions
Q : qu'en est-il de l'expression re.compile(r"\s\tWord")
? A : Il est plus facile de comprendre en séparant la chaîne de caractères de la compilation de l'expression régulière, et en les comprenant séparément.
s = r"\s\tWord"
prog = re.compile(s)
La chaîne s
contient huit caractères : a barre oblique inverse , un s , a barre oblique inverse , a t puis quatre caractères Word
.
Q : Qu'advient-il des tabulations et des espaces ? A : Au niveau du langage Python, les chaînes de caractères s
n'a pas onglet y espace caractère. Il commence par quatre caractères : barre oblique inverse , s , barre oblique inverse , t . Le système d'expressions régulières, quant à lui, traite cette chaîne comme un code source dans le langage des expressions régulières, où il signifie "correspondre à une chaîne composée d'un caractère d'espacement, d'un caractère de tabulation et des quatre caractères Word
.
Q : Comment faire correspondre ces deux éléments s'ils sont traités comme des backlash-s et backslash-t ? A : La question est peut-être plus claire si les mots "you" et "that" sont précisés : comment le système d'expressions régulières fait-il correspondre les expressions backlash-s et backslash-t ? En tant que "tout caractère d'espacement" et en tant que ' onglet caractère".
Q : Ou si vous avez la chaîne de 3 caractères backslash-n-newline ? A : Dans le langage Python, la chaîne de 3 caractères backslash-n-newline peut être représentée comme une chaîne conventionnelle "\\n\n"
ou chaîne de caractères brute et conventionnelle r"\n" "\n"
ou d'autres manières. Le système d'expressions régulières fait correspondre la chaîne de 3 caractères backslash-n-newline lorsqu'il trouve deux caractères consécutifs nouvelle ligne caractères.
N.B. Tous les exemples et toutes les références documentaires se rapportent à Python 2.7.
Mise à jour : Incorporation des clarifications des réponses de @Vladislav Zorov et @m.buettner, et de la question de suivi de @Aerovistae.