【问题标题】:How to escape “\” characters in python如何在python中转义“\”字符
【发布时间】:2012-05-08 03:09:07
【问题描述】:

我对正则表达式非常陌生,并尝试使用 python 获取“\”字符

通常我可以像这样逃避“\”

print ("\\");
print ("i am \\nit");

输出

\
i am \nit

但是当我在 regX 中使用它时,它并没有像我想象的那样工作

print (re.findall(r'\\',"i am \\nit"));

并返回我的输出

['\\']

谁能解释一下原因

【问题讨论】:

标签: python regex


【解决方案1】:

编辑:问题是实际上print 如何处理列表和字符串。它打印字符串的表示,而不是字符串本身,只包含反斜杠的字符串的表示是'\\'。所以findall 实际上是正确地找到了单个反斜杠,但是print 并没有像你期望的那样打印它。试试:

>>> print(re.findall(r'\\',"i am \\nit")[0])
\

(以下是我的原始答案,可以忽略(完全不相关),我最初误解了这个问题。但它似乎已经被点赞了,所以我把它留在这里。)

字符串上的r前缀表示该字符串处于“原始”模式,即\不被视为特殊字符(与“正则表达式”无关)。

但是,r'\' 不起作用,因为您不能以反斜杠结束原始字符串,it's stated in the docs

即使在原始字符串中,字符串引号也可以用反斜杠转义,但反斜杠保留在字符串中;例如,r"\"" 是由两个字符组成的有效字符串文字:反斜杠和双引号;r"\" 不是有效的字符串文字(即使原始字符串也不能以奇数个反斜杠结尾)。具体来说,原始字符串不能以单个反斜杠结尾(因为反斜杠会转义后面的引号字符)。

但您实际上可以使用非原始字符串来获得单个反斜杠:"\\"

【讨论】:

  • 在 Python 2.7 中,re.compilte("\\") 给出错误 error: bogus escape (end of line)
  • 要通过正则表达式匹配实际的反斜杠,您需要在正则表达式中使用两个反斜杠,然后再使用两个反斜杠来转义:re.compile("\\\\") 生成一个匹配单个反斜杠的正则表达式。
  • @LimboPeng,我读错了问题,所以我原来的答案不正确。
  • @dbaupp 糟糕!我正要写同样的答案 - 伤心:(
  • Python 在两遍中解析字符串:首先它找出开始的引号标记并寻找结束引号标记的位置 - 这对原始字符串以相同的方式处理引号旁边的反斜杠;它必须,因为否则您无法将引号嵌入原始字符串中。在第二遍中,引号之间的内容被解释。
【解决方案2】:

谁能解释一下原因

因为re.findall 找到了一个匹配项,并且匹配项包含一个反斜杠。它给了你一个包含一个元素的列表,它是一个字符串,它有一个字符,它是一个反斜杠。

写成 ['\\'] 是因为 '\\' 是您编写“带有一个反斜杠的字符串”的方式 - 就像您在编写示例代码 print "\\" 时必须做的那样。

【讨论】:

    【解决方案3】:

    请注意,您在这里使用了两种不同的字符串字面量——常规字符串"a string" 和原始字符串r"a raw string"。常规字符串文字观察反斜杠转义,因此要在字符串中实际放置反斜杠,您也需要对其进行转义。原始字符串文字将反斜杠视为任何其他字符,因此您可以在字符串中实际放入哪些字符(没有需要转义码的特殊字符)受到更多限制,但输入正则表达式之类的内容更容易,因为您不需要如果您需要在字符串中添加反斜杠以使其有意义,则需要将反斜杠加倍,而不仅仅是在创建字符串时。

    【讨论】:

      【解决方案4】:

      没有必要在原始字符串中转义反斜杠,除非反斜杠紧跟在右引号之前。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-22
        相关资源
        最近更新 更多