【问题标题】:Why does regular expression understand \n without r prefix?为什么正则表达式理解 \n 没有 r 前缀?
【发布时间】:2016-06-18 19:19:50
【问题描述】:

我一直在阅读很多问题以找到答案,如果我错过了,我很抱歉。

假设我有一个只包含换行符的文本。
text ='\n'

因为正则表达式使用反斜杠字符 ('\') 来转义 Python 等特殊含义字符,所以我们将使用原始字符串表示法匹配换行符,就像 answer 建议的那样。 (如果我错了,请纠正我)

所以我们将使用regex = re.compile(r'\n'),正则表达式解析器可以读取反斜杠和字符“n”并将其解释为换行符。

我的问题是为什么regex = re.compile('\n') 也可以工作?

我尝试做regex.match(text),结果是<_sre.SRE_Match object; span=(0, 1), match='\n'>,这与原始字符串表示法相同。


是不是因为here写的文件?其中说:

Python 字符串文字支持的大多数标准转义也被正则表达式解析器接受: \a \b \f \n \r \t \v \x \\

谁能详细解释一下?

【问题讨论】:

  • 我认为您的问题是二合一的答案。正则表达式引擎实际上能够搜索文字换行符。
  • 由文字'\n'产生的字符串包含反斜杠。它包含一个换行符。换行符没有任何特殊的正则表达式含义。
  • @WiktorStribiżew 我只是对它的工作原理感到困惑......所以我期待更详细的解释
  • @khelwood 这是否意味着 \a \f \r \t \v \x \\ 也会起作用,因为它们对正则表达式没有特殊意义?
  • @LeO 如果你写(例如)'\a\f\r\t\v\x00' 作为字符串文字,它产生的字符串将不包含反斜杠,因此正则表达式解析器不会认为该字符串包含任何特殊的正则表达式字符.如果将 `\` 放在字符串文字中,则生成的字符串包含一个反斜杠,这对于正则表达式解析器确实具有特殊含义,具体取决于后面的字符。

标签: python regex python-3.x string-literals rawstring


【解决方案1】:

r'\n' 禁止对字符串文字的解释。这样,它包含两个字符'\''n'。这两个字符被正则表达式引擎解释为 换行序列。在第二种情况下,'\n' 首先被转换为换行符序列(即 Unix 系统上的 LF,即一个字符;或 Windows 上的 CR LF,即两个字符,...)。正则表达式编译器将其视为明确给定的字符(无反斜杠,无特殊解释)。

【讨论】:

  • 这是否意味着正则表达式编译器也可以采用 \a \b \f \r \t \v \x \\ ?
  • @Le0:是的,情况相同。基本上,您想表达一个特殊字符(或一系列特殊字符)。您可以直接将其写入源代码。但是,有些字符在编辑器中是不可见的,或者会破坏编程语言的语法(如换行符),或者无法在源代码文件使用的编码中表示。这就是使用转义序列的原因。对于一些仅用于正则表达式的特殊序列,正则表达式还需要反斜杠。因为r'raw string literals' 是首选。
猜你喜欢
  • 1970-01-01
  • 2023-04-01
  • 2018-06-28
  • 2023-01-07
  • 2010-09-07
  • 2013-11-15
  • 1970-01-01
  • 2018-03-28
相关资源
最近更新 更多