【问题标题】:Don't raw strings treat backslashes as a literal character? [duplicate]原始字符串不将反斜杠视为文字字符吗? [复制]
【发布时间】:2020-08-19 01:14:12
【问题描述】:

我对在 python 中使用 re 模块时的反斜杠有疑问。考虑代码:

import re
message = 'My phone number is 345-298-2372'
num_reg = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d') 
match = num_reg.search(message)
print(match.group())

在上面的代码中,原始字符串被传递给re.compile 方法,但反斜杠仍然不被视为文字字符,因为/d 仍然是一个数字的占位符。那为什么是原始字符串呢?

【问题讨论】:

  • ... 因为这就是\d 在正则表达式中的含义?在这种特殊情况下,原始字符串不会做任何事情。
  • @Loocid 不,不会。 r'\d\d\d-\d\d\d-\d\d\d\d''\d\d\d-\d\d\d-\d\d\d\d' 产生相同的字符串。即r'\d\d\d-\d\d\d-\d\d\d\d' == '\d\d\d-\d\d\d-\d\d\d\d'
  • \d 不是需要转义的特殊序列,在原始字符串或“普通”字符串中使用它并没有什么区别。 \n(换行符)之类的东西是原始字符串产生2个文字字符而不是单个字符的地方。这里有一个 Python 中的“转义序列”表docs.python.org/3/reference/…
  • @juanpa.arrivillaga 它确实做了一些事情。防止 DeprecationWarning: invalid escape sequence \d.

标签: python regex python-re


【解决方案1】:

用于 re 和 raw 字符串的 documentation 很好地回答了这个问题。

因此,在您的示例中,传递给 re.compile() 的参数最终包含原始 \。这在使用 re 时是可取的,因为它有自己的转义序列,可能与 python 的转义序列冲突,也可能不冲突。通常,在使用正则表达式时使用 r'foo' 会更方便,因此您不必双重转义正则表达式特殊字符。

如果没有原始字符串,为了使转义字符重新进行处理,您需要使用:

import re
message = 'My phone number is 345-298-2372'
num_reg = re.compile('\\d\\d\\d-\\d\\d\\d-\\d\\d\\d\\d') 
match = num_reg.search(message)
print(match.group())

您可以考虑查看正则表达式量词/重复语法,因为它通常会使 re 更具可读性:

import re
message = 'My phone number is 345-298-2372'
num_reg = re.compile(r'\d{3}-\d{3}-\d{4}') 
match = num_reg.search(message)
print(match.group())

【讨论】:

猜你喜欢
  • 2012-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 2010-10-13
  • 2011-02-23
相关资源
最近更新 更多