【问题标题】:How to fix "<string> DeprecationWarning: invalid escape sequence" in Python?如何在 Python 中修复“<string> DeprecationWarning: invalid escape sequence”?
【发布时间】:2019-02-19 12:04:15
【问题描述】:

我在 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 \(

它们是什么意思?我该如何解决?

【问题讨论】:

  • 使用 Python 3.8-dev 这将为您提供 SyntaxWarning 而不是 DeprecationWarning 并且适用相同的解决方案。

标签: python python-3.x python-3.6


【解决方案1】:

当我将路径名称中的 \ 更改为 \\ 时,解决了 Invalid escape sequence 警告。供您参考,请在下面找到随附的屏幕截图。我在 pycharm 中遇到了这个错误:

【讨论】:

    【解决方案2】:

    \ is the escape character in Python string literals.

    例如,如果您想在字符串中添加制表符,您可以这样做:

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

    如果您想将文字 \ 放入字符串中,您必须使用 \\

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

    或者使用“原始字符串”:

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

    您不能只在需要的时候在字符串文字中添加反斜杠。反斜杠在后面没有有效转义序列之一和newer versions of Python print a deprecation warning 时无效。例如\A 不是转义序列:

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

    如果你的反斜杠序列不小心匹配了 Python 的转义序列之一,但你不是故意的,那就更糟了。

    因此,您应该始终使用原始字符串或\\

    重要的是要记住,字符串文字仍然是字符串文字,即使该字符串旨在用作正则表达式。 Python's regular expression syntax 支持许多以\ 开头的特殊序列。例如\A 匹配字符串的开头。但是\A 在 Python 字符串文字中无效!这是无效的:

    my_regex = "\Afoo"
    

    您应该这样做:

    my_regex = r"\Afoo"
    

    文档字符串是另一个要记住的:文档字符串也是字符串文字,无效的\ 序列在文档字符串中也是无效的!如果文档字符串包含 \'s,则使用原始字符串 (r"""...""")。

    【讨论】:

    • 但是,如果您有一个包含字符串的变量,如何将其转换为原始字符串,以免被误解?这对我不起作用:r"{}".format(my_variable)
    • 原始字符串与常规字符串的类型不同,它只是在源代码中编写字符串文字的不同方式。一旦你有一个包含字符串的变量,就是一个字符串。常规或原始之间没有区别或区别
    • 转义反斜杠适用于转义点的正则表达式。这就是我想到的地方。见my answer here to "Regular expression to match a dot"。因此,您必须使用"\\."r"\." 而不是"\."。我花了一段时间才弄清楚。你的回答有帮助。谢谢。
    猜你喜欢
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多