Python regex - r préfixe
Quelqu'un peut-il expliquer pourquoi l'exemple 1 ci-dessous fonctionne, lorsque le r
préfixe n'est pas utilisé?
Je pensais que le r
préfixe doit être utilisé chaque fois que les séquences d'échappement sont utilisés.
Exemple 2 et 3 de l'exemple le démontrer.
# example 1
import re
print (re.sub('\s+', ' ', 'hello there there'))
# prints 'hello there there' - not expected as r prefix is not used
# example 2
import re
print (re.sub(r'(\b\w+)(\s+\b)+', r'', 'hello there there'))
# prints 'hello there' - as expected as r prefix is used
# example 3
import re
print (re.sub('(\b\w+)(\s+\b)+', '', 'hello there there'))
# prints 'hello there there' - as expected as r prefix is not used
Vous devez vous connecter pour publier un commentaire.
Parce que
\
commencer les séquences d'échappement seulement quand ils sont valables pour les séquences d'échappement.Ne jamais compter sur les matières premières chaînes de chemin de littéraux, comme matières premières cordes sont plutôt de particulière fonctionnement interne, connu pour avoir mordu de personnes dans le cul:
Pour mieux illustrer ce dernier point:
'\s'
(commer'\s'
) est également représenté comme'\\s'
, en raison de'\s'
n'étant pas reconnu séquence d'échappement.le " r " signifie ce qui suit est une "première chaîne", c'est à dire. les barres obliques inverses sont traités littéralement au lieu de signifier un traitement spécial du caractère suivant.
http://docs.python.org/reference/lexical_analysis.html#literals
donc
'\n'
est un simple retour à la ligneet
r'\n'
est de deux caractères - une barre oblique inverse et la lettre 'n'une autre façon d'écrire, il serait
'\\n'
parce que la première barre oblique inverse échappe à la deuxièmede manière équivalente de la rédaction de ce
est
En raison de la façon Python traite les caractères qui ne sont pas valides des caractères d'échappement, pas tous de ces doubles barres obliques inverses sont nécessaires - par exemple
'\s'=='\\s'
cependant ce n'est pas vrai pour'\b'
et'\\b'
. Ma préférence est pour être explicite et double toutes les barres obliques inverses.Pas toutes les séquences impliquant des barres obliques inverses sont des séquences d'échappement.
\t
et\f
sont, par exemple, mais\s
ne l'est pas. Dans un non-raw littéral de chaîne, tout\
qui ne fait pas partie d'une séquence d'échappement est perçu comme un\
:\b
est une séquence d'échappement, cependant, de sorte que l'exemple 3 échoue. (Et oui, certaines personnes considèrent que ce comportement plutôt malheureux.)r"\"
est pas valide, pour faire ce que vous avez à faire"\\"
. Si vous ner"\\"
, vous obtenez un\\
imprimé ("\\\\"
chaîne). Soyez prudent avec ça.