【问题标题】:Why does Regex raw string prefix "r" not work as expected?为什么正则表达式原始字符串前缀“r”不能按预期工作?
【发布时间】:2018-02-04 00:42:47
【问题描述】:

我了解到“r"\n" 是一个包含'\''n' 的两个字符的字符串,而"\n" 是一个包含一个换行符的一个字符的字符串。正则表达式通常会使用它在Python 代码中编写原始字符串表示法。”而r"\n" 等价于"\\n" 来表示两个字符串'\''n'

我通过打印测试它,它可以工作

>>>print(r"\n") or print("\\n")
'\n'

但是,当我在正则表达式中测试时

>>>import re
>>>re.findall("\d+", '12 cats, 10 dogs, 30 rabits, \d is here')
['12', '10', '30']
>>>re.findall(r"\d+", '12 cats, 10 dogs, 30 rabits, \d is here')
['12', '10', '30']  # Still the same as before, seems 'r' doesn't work at all
>>>re.findall("\\d+", '12 cats, 10 dogs, 30 rabits, \d is here')
['12', '10', '30']  # Doesn't work yet

当我尝试这个时,它仍然有效

>>>re.findall(r"\\d+", '12 cats, 10 dogs, 30 rabits, \d is here')
['\\d']
>>>re.findall("\\\d+", '12 cats, 10 dogs, 30 rabits, \d is here')
['\\d']
>>>re.findall("\\\\d+", '12 cats, 10 dogs, 30 rabits, \d is here')
['\\d']  # Even four backslashes

为什么?这是否意味着在使用正则表达式时我必须再添加一个反斜杠以确保它是原始字符串?

参考:https://docs.python.org/3/howto/regex.html

【问题讨论】:

  • "\d+" 不是反斜杠具有任何非字面意义的字符串,因此无论是否使用原始语法指定它都有效。然而,对于人类读者来说,原始语法更清晰——他们不必考虑 "\d" 的解析方式是否不同,就像 "\t""\n" 等等。
  • 原始字符串禁用 Python 的反斜杠处理。它们不会禁用正则表达式引擎的反斜杠处理;这将完全违背原始字符串的目的。

标签: python regex backslash


【解决方案1】:

"\d+" 起作用的原因是"\d" 在 Python 字符串中不是正确的转义序列,Python 只是将其视为反斜杠后跟“d”而不是产生语法错误。

所以"\d""\\d"r"\d" 都是等价的,表示一个包含一个反斜杠和一个d 的字符串。正则表达式引擎看到这个反斜杠+“d”并将其解释为“匹配任何数字”。

另一方面,"\\\d""\\\\d"r"\\d" 都包含两个反斜杠,后跟一个“d”。这告诉正则表达式引擎匹配一个反斜杠,后跟一个“d”。

【讨论】:

    猜你喜欢
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    • 2022-08-20
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多