【问题标题】:The use of slash in python string and regexpython字符串和正则表达式中斜线的使用
【发布时间】:2018-11-05 10:20:52
【问题描述】:

示例:

s = r't\s t t\\s'
print(re.findall('\s',s))
print(re.findall('\\s',s))

我发现这两条语句打印的结果是一样的:[' ', ' '],说明在Python的字符串类中\s\\s是一样的。实际上,当我在 Python 的交互界面中输入以下代码时,我得到了这个:

>>> str1 = '\s'
>>> str1
'\\s'

看来python会将\s转换为\\s。为什么 Python 会这样做,这是为了什么?在 Java 等其他语言中是否也一样?

其实我要问的是:在 Python 中,如果我想匹配空格,我输入的正则表达式和字符串都可以是"\s",对吧?但是,在 Java 中,正则表达式应该是 "\s",而字符串应该是 "\\s"。这两种语言似乎对 String "\s" 的处理方式不同。为什么?

【问题讨论】:

  • 在Java等其他语言中也一样吗? -- 是的,反斜杠被转义了。
  • @cricket_007 谢谢!所以如果我想匹配Java中的空格,字符串"\s" "\\s"都可以吗?
  • "\s" 是一个空格。 "\\s" 是一个反斜杠,后跟字符 s
  • @cricket_007,谢谢!但实际上,我要问的是:在 Python 中,如果我想匹配空格,我输入的正则表达式和字符串都可以是"\s"。但是,在Java中,regex应该是"\s",而String应该是"\\s",为什么这两种语言会有不同呢?

标签: python regex string escaping


【解决方案1】:

Python 只是在转义它,所以当它看到一个字母继续的“\”并且如果该字母没有任何特殊含义时,Python 实际上会转义反斜杠,而不是抛出任何错误。

Python 交互界面使用repr 返回一个字符串,其中包含一个对象的可打印表示。因此,该函数添加了额外的反斜杠以表明它是文字反斜杠。

如果您使用打印功能显示str1 的值,您将在标准输出中打印它,只需1 个反斜杠。

看这个例子:

str1 = '\s'

print str1
print str1.__repr__()

【讨论】:

  • 谢谢。实际上,我要问的是:在 Python 中,如果我想匹配空格,我输入的正则表达式和字符串都可以是"\s",对吧?但是,在 Java 中,正则表达式应该是 "\s",而字符串应该是 "\\s"。这两种语言似乎对待 String "\s" 的方式不同。
【解决方案2】:

看来python会转换\sto\s。

不要将字符串表示与字符串的实际内容混淆。字符串表示是您在源代码中编写字符串的方式,它可能与实际在内存中的字符串不完全相同。反斜杠经过特殊解析,允许您使用反斜杠语法编写不可打印的字符。在这种情况下,\s 不是有效的转义序列,因此 python 解析器将其解释为反斜杠-s。在内存中,字符串仍然是一个包含字母的字符序列:`\, s

str 类有一个__repr__()/repr() 方法,该方法返回一个字符串,该字符串包含该字符串的源代码表示,这是在 REPL 中不使用print 语句时打印的字符串.这允许您复制粘贴这些字符串并在 shell 的另一部分重用它,但这并不是真正存储在内存中的内容以及 python 如何解释字符串。当打印 repr 时,python 总是转义一个文字反斜杠,这是为了消除反斜杠是否被解释为转义序列或文字字符的歧义。

为什么 Python 会这样做,这是为了什么?在 Java 等其他语言中是否也一样?

大多数语言的字符串文字都会解释反斜杠转义序列,尽管不同的语言对无效转义序列的处理方式不同。在 Python 中,无效的反斜杠转义序列被默默地视为文字反斜杠,而不是产生错误。您可能会在 Python 中更频繁地遇到此类问题,因为它有一个无处不在的 repr() 协议,并且在 REPL shell 中默认使用 repr

【讨论】:

  • 谢谢!这是我对第二个问题的理解:当遇到无效的反斜杠转义序列时,Python 会默默地将其视为文字反斜杠(就像在它之前添加反斜杠一样),但像 Java 这样的语言会产生错误。对吗?
猜你喜欢
  • 1970-01-01
  • 2020-07-23
  • 1970-01-01
  • 1970-01-01
  • 2021-07-10
  • 1970-01-01
  • 2015-07-14
  • 1970-01-01
  • 2016-01-10
相关资源
最近更新 更多