【问题标题】:How to escape special characters of a string with single backslashes如何使用单个反斜杠转义字符串的特殊字符
【发布时间】:2013-09-26 23:05:53
【问题描述】:

我正在尝试使用单个反斜杠 \ 来转义字符 -]\^$*.

例如字符串:^stack.*/overflo\w$arr=1 将变为:

\^stack\.\*/overflo\\w\$arr=1

在 Python 中最有效的方法是什么?

re.escape 双重转义,这不是我想要的:

'\\^stack\\.\\*\\/overflow\\$arr\\=1'

我需要这个来逃避其他事情(nginx)。

【问题讨论】:

    标签: python nginx escaping


    【解决方案1】:

    我们可以在 Python 3.7 中使用内置函数 repr() 或字符串插值 fr'{}' 转义所有反斜杠 \。*

    repr('my_string')fr'{my_string}'

    查看链接:https://docs.python.org/3/library/functions.html#repr

    【讨论】:

      【解决方案2】:

      re.escape 不会双重转义。如果您在 repl 中运行,它看起来就像它一样。第二层转义是输出到屏幕造成的。

      使用 repl 时,尝试使用 print 来查看字符串中的真正内容。

      $ python
      >>> import re
      >>> re.escape("\^stack\.\*/overflo\\w\$arr=1")
      '\\\\\\^stack\\\\\\.\\\\\\*\\/overflo\\\\w\\\\\\$arr\\=1'
      >>> print re.escape("\^stack\.\*/overflo\\w\$arr=1")
      \\\^stack\\\.\\\*\/overflo\\w\\\$arr\=1
      >>>
      

      【讨论】:

        【解决方案3】:

        利用内置repr的输出处理\r\n\t,处理re.escape的输出就是你想要的:

        re.escape(repr(a)[1:-1]).replace('\\\\', '\\')
        

        【讨论】:

          【解决方案4】:

          简单地使用re.sub 也可以代替str.maketrans。这也适用于 python 2.x

          >>> print(re.sub(r'(\-|\]|\^|\$|\*|\.|\\)',lambda m:{'-':'\-',']':'\]','\\':'\\\\','^':'\^','$':'\$','*':'\*','.':'\.'}[m.group()],"^stack.*/overflo\w$arr=1"))
          \^stack\.\*/overflo\\w\$arr=1
          

          【讨论】:

            【解决方案5】:

            这是一种方法(在 Python 3.x 中):

            escaped = a_string.translate(str.maketrans({"-":  r"\-",
                                                      "]":  r"\]",
                                                      "\\": r"\\",
                                                      "^":  r"\^",
                                                      "$":  r"\$",
                                                      "*":  r"\*",
                                                      ".":  r"\."}))
            

            作为参考,转义字符串以在正则表达式中使用:

            import re
            escaped = re.escape(a_string)
            

            【讨论】:

            • @hcwhsa string.translatea_variable_called_string.translate 一样,而不是模块字符串中调用 translate 的函数。
            • 应该提一下,maketrans 是在 python 3 中,而不是 python 2.x
            • maketrans() 仍在 Python 2 中。它在字符串模块中,而不是 str 对象中:docs.python.org/2/library/string.html#string.maketrans
            • maketrans 在 python2 中的行为非常不同,要求输入和输出字符串的长度相同,并且它不接受字典输入。做这些翻译不太好。
            【解决方案6】:

            只是假设这是一个正则表达式,使用re.escape

            【讨论】:

            • 注意代替 dv:作者在发布此答案后编辑了问题,以澄清 re.escape 不是他们想要的。
            • @Air:我会在某个时候调查确切的不兼容性,但问题的作者认为它不起作用,因为它双重转义,但那是因为它们是在 REPL 中使用它,那就是 repr()。对于给出的示例,它实际上并没有这样做,并且在 Nginx 中确实有效。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-12-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-03-23
            相关资源
            最近更新 更多