DeprecationWarning: séquence d'échappement non valide - que faut-il utiliser à la place de \ d?

106

J'ai rencontré un problème avec le remodule dans Python 3.6.5. J'ai ce modèle dans mon expression régulière:

'\\nRevision: (\d+)\\n'

Mais quand je le lance, j'obtiens un DeprecationWarning.

J'ai recherché le problème sur SO , et je n'ai pas trouvé la réponse, en fait, que dois-je utiliser à la place \d+? Juste [0-9]+ou peut-être autre chose?

mchfrnc
la source
2
Cela ne devrait pas être le problème, fournir plus de code?
Sraw
3
Double évasion \dou utilisation r'\\nRevision: (\d+)\\n'?
revo

Réponses:

176

Python 3 interprète les littéraux de chaîne comme des chaînes Unicode, et donc votre \dest traité comme un caractère Unicode échappé.

Déclarez votre modèle RegEx en tant que chaîne brute à la place en le préfixant r, comme ci-dessous:

r'\nRevision: (\d+)\n'

Cela signifie également que vous pouvez également supprimer les échappements, \ncar ceux-ci seront simplement analysés en tant que caractères de nouvelle ligne par re.

ACascarino
la source
8
Pour être un peu plus précis, elle \dest traitée comme une séquence d'échappement non reconnue et, en tant que telle, reste inchangée. Un DeprecationWarning est donné depuis Python 3.6. Dans certaines versions futures de Python, ce sera une SyntaxError. Détails de "2.4.1. Littéraux de chaîne et d'octets" dans la documentation.
VPfB
@VPfB le fil est vieux, mais je cherchais des réponses sur le même problème. Si \ d est traité comme un caractère Unicode échappé, comment distinguer d (caractère alphabétique) de \ d (n'importe quel chiffre) sans traiter le modèle regex comme une chaîne brute? (La même question s'applique à \ w, \ W etc ...)
giulia_dnt
2
@theggg Si je comprends bien votre question, échappez à la barre oblique inverse, pour que la chaîne se lise '\\d'.
ACascarino le