web-dev-qa-db-ja.com

Pythonで「<string> DeprecationWarning:invalid escape sequence」を修正する方法は?

私は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 \(

彼らはどういう意味ですか?そして、どうすればそれらを修正できますか?

17
Sean Hammond

\はPython文字列リテラル のエスケープ文字です。

たとえば、文字列にタブ文字を挿入する場合は、次のようにします。

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

文字列にリテラル\を入れたい場合は、\\を使用する必要があります。

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

または、「生の文字列」を使用します。

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

必要に応じて、文字列リテラルにバックスラッシュを入れることはできません。有効なエスケープシーケンスが1つも続かない場合、バックスラッシュは無効です。 Python非推奨の警告を出力 の新しいバージョン。たとえば、\Aエスケープシーケンスではありません。

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

バックスラッシュシーケンスがPythonのエスケープシーケンスの1つと誤って一致する場合でも、それを意味するものではない場合、それはさらに悪いことです。

したがって、常に生の文字列または\\を使用する必要があります。

文字列が正規表現として使用されることを意図している場合でも、文字列リテラルは依然として文字列リテラルであることを覚えておくことが重要です。 Pythonの正規表現構文 は、\で始まる多くの特別なシーケンスをサポートします。たとえば、\Aは文字列の先頭に一致します。ただし、\AはPython文字列リテラルで無効です!これは無効です:

my_regex = "\Afoo"

代わりにこれを行う必要があります:

my_regex = r"\Afoo"

覚えておくべきもう1つのドキュメント文字列です。ドキュメント文字列も文字列リテラルであり、無効な\シーケンスはドキュメント文字列でも無効です。 docstringにr"""..."""が含まれている場合は、未加工の文字列(\)を使用します。

21
Sean Hammond

ショーン・ハモンドの答えの要約として(私の場合に必要なものだけを考慮に入れて)、正規表現の「PEP8:無効なエスケープシーケンス」を避けるために、正規表現文字列の前に「r」文字を使用します。

my_regex = r"\Afoo"
0
Loaderon