【问题标题】:How to prevent automatic escaping of special characters in Python如何防止Python中特殊字符的自动转义
【发布时间】:2012-09-18 06:39:27
【问题描述】:

我正在编写一个 Python 脚本,它接受文件路径作为字符串、解析它们、附加命令名称并构建一个列表,然后将其传递给 subprocess.Popen() 以执行。该脚本用于处理 Unix 和 Windows 文件路径,最终应该在两个系统上运行。

当我在 Unix 下运行它时,如果我提供的 Windows 路径无意中包含转义字符(例如 \Users\Administrator\bin),Python 会将嵌入的 \b 解释为退格字符。我想防止这种情况发生。

据我所知,没有函数或方法可以将字符串变量表示为原始字符串。 'r' 修饰符仅适用于字符串常量。

到目前为止,我能得到的最接近的是:

winpath = "C:\Users\Administrator\bin" 
winpath = winpath.replace('\b','\\b')
winpathlist = winpath.split('\\') 

此时,winpathlist 应该包含['C:','Users','Administrator','bin'],而不是['C','Users','Administrator\x08in']。

我可以向 winpath.replace() 添加额外的调用来处理我可能得到的其他转义 -- \a、\f、\n、\r、\t、\v -- 但不是 @ 987654335@.

有没有更 Pythonic 的方式来做到这一点?

【问题讨论】:

  • 您如何将值放入字符串中? Python 不应将 \b 视为转义符,除非它在字符串文字中,或者作为转义符进入字符串。 (另外,正斜杠也可以。)
  • @Wooble:现在,它通过 doctest 进入。 >>> myCommandObject.setExcecutablePath('C:\Program Files\cygwin\cdrive\bin') 其中 myCommandObject 包含命令名称(例如 'ps')、路径和参数列表。将斜杠从反斜杠更改为正斜杠不是一种选择;我的客户明确表示这是他想要的。
  • 正如我所说,r 仅适用于字符串文字;它不适用于字符串变量。我将领先的 r 视为一个 kluge。无论如何,这是 doctest(或其中的一部分): >>> myCommand.setExecutablePath('C:\Program Files\cygwin\cdrive\bin') >>> myCommandList = myCommand.getLaunchList() >>> myCommandList ['C :\\\\Program Files\\\\cygwin\\\\cdrive\\\\bin\\\\ps', '-e', '-f'] >>> myCommandList[0].split(" \\\\") ['C:', 'Program Files', 'cygwin', 'cdrive', 'bin', 'ps'] 我不再收到任何错误,现在我添加了替换调用.
  • 忘记感谢 Wooble 的帮助和建议。在与我的客户协商后,他选择将 Windows 路径测试从 doctest 中移出并放入单独的文件中。

标签: python escaping special-characters


【解决方案1】:

如果您的winpath 是硬编码的,您可能需要在字符串前使用r 来表示它是"raw string"。

winpath = r"C:\Users\Administrator\bin"

如果winpath不能被硬编码,你可以尝试新建一个字符串为:

escaped_winpath = "%r" % winpath

(这只是repr(winpath),并不会真正帮助你,因为repr("\bin") 是......)

解决方案是从头开始重建字符串:您可以在that link 找到函数示例,但一般的想法是:

escape_dict={'\a':r'\a',
             '\b':r'\b',
             '\c':r'\c',
             '\f':r'\f',
             '\n':r'\n',
             '\r':r'\r',
             '\t':r'\t',
             '\v':r'\v',
             '\'':r'\'',
             '\"':r'\"'}

def raw(text):
    """Returns a raw string representation of text"""
    new_string=''
    for char in text:
        try: 
            new_string += escape_dict[char]
        except KeyError: 
            new_string += char
    return new_string

现在,raw("\bin") 给你"\\bin"(而不是"\\x08in")...

【讨论】:

  • 我不熟悉repr()。是2.6的吗?我喜欢这个想法,并且会坚持下去,以防我将来需要它。应我的客户的要求,我取消了对 replace() 的调用。相反,他建议我将 Windows 路径测试从 doctest 中移出并放入单独的文件中。感谢您的建议。
【解决方案2】:

您可以通过将 r 添加到字符串文字符号来创建原始字符串

r"hello\nworld"

变成

"hello\\nworld"

您可以阅读更多here

【讨论】:

  • 否定。如果我按照您的建议将 r 放入 doctest 字符串中,它将成为字符串的一部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-15
  • 2015-01-01
  • 2017-05-02
  • 2016-06-11
  • 1970-01-01
  • 2011-05-11
  • 1970-01-01
相关资源
最近更新 更多