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?


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.