【问题标题】:python raw string escaping characterpython原始字符串转义字符
【发布时间】:2016-02-05 14:33:15
【问题描述】:

一个菜鸟问题。我正在阅读有关在 python 中使用正则表达式的文档。我的印象是,使用原始字符串会按原样处理 '\' 而不会将其后的任何内容视为转义序列。然而,在我正在阅读的示例中,

>>> phoneNumRegex = re.compile(r'(\(\d\d\d\)) (\d\d\d-\d\d\d\d)')
>>> mo = phoneNumRegex.search('My phone number is (415) 555-4242.')
>>> mo.group(1)
'(415)'
>>> mo.group(2)
'555-4242'

显然,作者已经用 '\' 转义了 '(' 。我想了解如何。我认为在带来的时候加上 'r' 会对待 '\' 没有什么不同。

【问题讨论】:

  • 我看不出这里有什么不清楚的地方。原始字符串文字中的\ 是文字\,正是我们需要用来转义速记字符类和特殊正则表达式字符的东西。
  • 我认为我对原始字符串的理解存在很大的漏洞。所以原始字符串仅适用于python解释器,在任何地方使用'\'休息实际上会做应该做的事情,就像正则表达式一样?
  • 将正则表达式引擎想象成一个交付字符串的客户。回复需要\d。当你使用 "\d" 时,Python 认为它是一个类似\n 的转义序列,但事实并非如此,所以它保留了\,因为这是未知转义序列的默认行为,并将\d 提供给重新引擎.当您编写r"\d" 时,Python 知道\ 是一个文字\,并且很容易将\d 提供给re 引擎。
  • ( 是分组结构的开始,必须有一个未转义的结束 )这些(...) 绝不是比赛的一部分\(\) 是文字 () 并且这些是匹配的一部分。这是你需要澄清的吗?
  • 我在一个答案中收集了我的 cmets。

标签: python regex escaping


【解决方案1】:

是的,为了定义正则表达式,这段代码转义了 '(',但 Python 解释器在字符串中保留了 '\'。

如果不使用原始字符串文字形式定义它,您将不得不编写:

phoneNumRegex = re.compile('(\\(\\d\\d\\d\\)) (\\d\\d\\d-\\d\\d\\d\\d)')

【讨论】:

  • 那么,正则表达式将'\'视为转义序列?
  • 是的,这首先是所有这些 '\' 的目的 - 区分正则表达式应解释为分组运算符(无转义)的 '(' 与 '('应该在输入字符串中解析(必须转义)。看看给定的正则表达式中有两个组吗?第一组在括号内包含 3 个数字。组内的括号必须转义,否则正则表达式编译器会认为你正在指定组内的组,并且与输入字符串中的括号不匹配。
  • 谢谢保罗的解释:)
【解决方案2】:

原始字符串文字中的\ 是文字\,正是我们需要使用它来转义速记字符类和特殊正则表达式字符。

( 是分组结构的开始,必须有一个未转义的结束 )这些(...) 绝不是比赛的一部分\(\) 是文字 (),它们是匹配的一部分。

将正则表达式引擎视为交付字符串的客户。回复需要\d。当您使用“\d”时,Python 认为它是类似\n 的转义序列,但事实并非如此,因此它保留了\,因为这是未知转义序列的默认行为,并将\d 提供给重新引擎.当您编写r"\d" 时,Python 知道\ 是一个文字\,并且很容易将\d 提供给re 引擎。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 2020-07-12
    相关资源
    最近更新 更多