web-dev-qa-db-fra.com

Comment réparer "<string> DeprecationWarning: séquence d'échappement invalide" en Python?

Je reçois beaucoup d'avertissements comme celui-ci en Python:

DeprecationWarning: invalid escape sequence \A
  orcid_regex = '\A[0-9]{4}-[0-9]{4}-[0-9]{4}-[0-9]{3}[0-9X]\Z'

DeprecationWarning: invalid escape sequence \/
  AUTH_TOKEN_PATH_PATTERN = '^\/api\/groups'

DeprecationWarning: invalid escape sequence \
  """

DeprecationWarning: invalid escape sequence \.
  DOI_PATTERN = re.compile('(https?://(dx\.)?doi\.org/)?10\.[0-9]{4,}[.0-9]*/.*')

<unknown>:20: DeprecationWarning: invalid escape sequence \(

<unknown>:21: DeprecationWarning: invalid escape sequence \(

Que signifient-ils? Et comment puis-je les réparer?

12
Sean Hammond

\ est le caractère d'échappement dans les littéraux de chaîne Python .

Par exemple, si vous voulez mettre un caractère de tabulation dans une chaîne, vous feriez:

>>> print("foo \t bar")
foo      bar

Si vous voulez mettre un \ littéral dans une chaîne, vous devez utiliser \\:

>>> print("foo \\ bar")
foo \ bar

Ou utilisez une "chaîne brute":

>>> print(r"foo \ bar")
foo \ bar

Vous ne pouvez pas simplement mettre des barres obliques inverses dans les littéraux de chaîne à tout moment. Une barre oblique inverse n'est pas valide si elle n'est pas suivie par l'une des séquences d'échappement valides, et les versions les plus récentes de Python affichent un avertissement relatif à la désapprobation . Par exemple, \A n'est pas une séquence d'échappement:

$ python3.6 -Wd -c '"\A"'
<string>:1: DeprecationWarning: invalid escape sequence \A

Si votre séquence de barre oblique inverse correspond accidentellement à l'une des séquences d'échappement de Python, mais que vous ne le vouliez pas, c'est encore pire.

Donc, vous devriez toujours utiliser des chaînes brutes ou \\.

Il est important de se rappeler qu'un littéral de chaîne est toujours un littéral de chaîne, même si cette chaîne est destinée à être utilisée en tant qu'expression régulière. La syntaxe d'expression régulière de Python prend en charge de nombreuses séquences spéciales commençant par \. Par exemple, \A correspond au début d'une chaîne. Mais \A n'est pas valide dans un littéral de chaîne Python! Ceci est invalide:

my_regex = "\Afoo"

Au lieu de cela, vous devriez faire ceci:

my_regex = r"\Afoo"

Les docstrings sont un autre exemple à retenir: docstrings sont également des littéraux de chaîne et les séquences non valides \ sont également invalides dans docstrings! Utilisez des chaînes brutes (r"""...""") pour les docstrings si elles contiennent des \.

13
Sean Hammond

En résumé de la réponse de Sean Hammond (en ne prenant en compte que ce dont j'avais besoin dans mon cas), pour éviter "PEP8: séquence d'échappement non valide" dans une expression rationnelle, utilisez 'r' avant la chaîne d'expression rationnelle: 

my_regex = r"\Afoo"
0
Loaderon