DeprecationWarning: nieprawidłowa sekwencja ucieczki - czego użyć zamiast \ d?

106

Napotkałem problem z remodułem w Pythonie 3.6.5. Mam ten wzorzec w moim wyrażeniu regularnym:

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

Ale kiedy go uruchomię, otrzymuję plik DeprecationWarning.

Szukałem problemu na SO i nie znalazłem odpowiedzi, właściwie - czego zamiast tego użyć \d+? Tylko [0-9]+czy może coś innego?

mchfrnc
źródło
2
To nie powinien być problem, podać więcej kodu?
Sraw
3
Podwójna ucieczka \dczy użycie r'\\nRevision: (\d+)\\n'?
revo

Odpowiedzi:

176

Python 3 interpretuje literały łańcuchowe jako ciągi znaków Unicode, a zatem Twój \djest traktowany jako znak Unicode ze zmianą znaczenia.

Zamiast tego zadeklaruj swój wzorzec wyrażenia regularnego rjako nieprzetworzony ciąg znaków, poprzedzając go , jak poniżej:

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

Oznacza to również, że możesz również porzucić \nznaki ucieczki, ponieważ zostaną one po prostu przeanalizowane jako znaki nowej linii przez re.

ACascarino
źródło
8
Aby być trochę bardziej precyzyjnym, \djest traktowany jako nierozpoznana sekwencja ucieczki i jako taka pozostaje niezmieniona. Od czasu Pythona 3.6 jest podawane ostrzeżenie DeprecationWarning. W niektórych przyszłych wersjach Pythona będzie to błąd SyntaxError. Szczegóły z „2.4.1. Literały ciągów i bajtów” w Dokumentach.
VPfB
@VPfB Wątek jest stary, ale szukałem odpowiedzi na ten sam problem. Jeśli \ d jest traktowane jako znak Unicode ze zmianą znaczenia, jak odróżnić d (znak alfabetyczny) od \ d (dowolna cyfra) bez traktowania wzorca wyrażenia regularnego jako nieprzetworzonego ciągu? (To samo pytanie dotyczy \ w, \ W itp ...)
giulia_dnt
2
@theggg Jeśli dobrze zrozumiem twoje pytanie - użyj znaku ukośnika odwrotnego, aby napis został odczytany '\\d'.
ACascarino