【问题标题】:How do I escape backslash and single quote or double quote in Python?如何在 Python 中转义反斜杠和单引号或双引号?
【发布时间】:2011-07-16 12:45:41
【问题描述】:

如何在 Python 中转义反斜杠和单引号或双引号?

例如:

Long string = '''some 'long' string \' and \" some 'escaped' strings'''
value_to_change = re.compile(A EXPRESION TO REPRESENT \' and \")
modified = re.sub(value_to_change, 'thevalue', Long_string)

## Desired Output
modified = '''some 'long' string thevalue and thevalue some 'escaped' strings'''

【问题讨论】:

    标签: python


    【解决方案1】:

    我尝试这样做打印单个反斜杠(Python 3):

    single_backslash_str = r'\ '[0]
    print('single_backslash_str')         #output: \
    print('repr(single_backslash_str)')   #output: '\\'
    

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      问题在于,在您的字符串中,\' 和 \" 被转换为 ' 和 ",因此在您的示例中,如果不匹配 周围的单引号,您将无法仅匹配 \'长

      但我的理解是这些数据来自一个文件,所以假设你的 your_file.txt 包含

      some 'long' string \' and \" some 'escaped' strings
      

      你可以用下面的代码替换\'和\":

      import re
      
      from_file = open("your_file.txt", "r").read()
      
      print(re.sub("\\\\(\"|')", "thevalue", from_file))
      

      注意四个斜线。由于这是一个字符串 \ 被转换为 \ (因为这是一个转义字符)。然后在正则表达式中,剩余的 \ 再次转换为 \,因为这也是正则表达式转义字符。结果将匹配单个斜杠和 " 和 ' 引号之一。

      【讨论】:

        【解决方案3】:

        你是怎么做到的

        如果您的“长字符串”是从文件中读取的(正如您在评论中提到的那样),那么您的问题具有误导性。由于您显然不完全了解转义的工作原理,因此您写下的问题可能与您真正遇到的问题不同。

        如果这些是您文件的内容(如图所示 51 个字节 + 可能是一到两个行尾字符):

        some 'long' string \' and \" some 'escaped' strings
        

        那么这就是它在 python 中的样子:

        >>> s1 = open('data.txt', 'r').read().strip()
        >>> s1
        'some \'long\' string \\\' and \\" some \'escaped\' strings'
        >>> print s1
        some 'long' string \' and \" some 'escaped' strings
        

        您在问题中写的内容将产生:

        >>> s2 = '''some 'long' string \' and \" some 'escaped' strings'''
        >>> s2
        'some \'long\' string \' and " some \'escaped\' strings'
        >>> print s2
        some 'long' string ' and " some 'escaped' strings
        >>> len(s)
        49
        

        你看出区别了吗?

        s2 中没有反斜杠,因为当您在 Python 中使用它们写下字符串时,它们具有特殊含义。当您从文件中读取它们时,它们没有特殊含义。

        如果你想写下一个后面有反斜杠的字符串,你必须保护你输入的反斜杠。你必须阻止 Python 认为它有特殊的含义。你可以通过转义来做到这一点 - 使用反斜杠。

        一种方法是使用反斜杠,但通常更简单且不易混淆的方法是使用原始字符串:

        >>> s3 = r'''some 'long' string \' and \" some 'escaped' strings'''
        'some \'long\' string \\\' and \\" some \'escaped\' strings'
        >>> print s3
        some 'long' string \' and \" some 'escaped' strings
        >>> s1 == s3
        True
        

        你是什么意思

        以上内容只是为了表明您的问题令人困惑。

        实际的答案有点难——当您使用正则表达式时,反斜杠具有另一层特殊含义。如果您想通过字符串转义和正则表达式转义到实际的正则表达式安全地获得反斜杠,则必须相应地写下多个反斜杠。

        此外,将单引号 (') 放在单引号原始字符串 (r'') 中的规则也有点棘手,因此我将使用带有三个单引号 (r'''''') 的原始字符串.

        >>> print re.sub(r'''\\['"]''', 'thevalue', s1)
        some 'long' string thevalue and thevalue some 'escaped' strings
        

        两个反斜杠在整个字符串转义过程中保持两个反斜杠,然后通过正则表达式转义变成一个没有特殊含义的反斜杠。总的来说,正则表达式说: "匹配一个反斜杠,后跟一个单引号或双引号。"

        应该怎么做

        现在来说说阻力:上一个确实很好地说明了 jwz 的含义1。如果您忘记了正则表达式(并且知道原始字符串),那么解决方案就会变得更加明显:

        >>> print s1.replace(r'\"', 'thevalue').replace(r"\'", 'thevalue')
        some 'long' string thevalue and thevalue some 'escaped' strings
        

        1 有些人在遇到问题时会想“我知道,我会使用正则表达式”。现在他们有两个问题。

        【讨论】:

        • 谢谢,这真的帮助我更好地理解它......非常感谢。
        【解决方案4】:

        请记住,所有这些字符串都是完全相同的:

        Long_string = '''some long string \' and \" some escaped strings'''
        Long_string = '''some long string ' and " some escaped strings'''
        Long_string = """some long string ' and " some escaped strings"""
        Long_string = 'some long string \' and \" some escaped strings'
        Long_string = "some long string \' and \" some escaped strings"
        Long_string = 'some long string \' and " some escaped strings'
        Long_string = "some long string ' and \" some escaped strings"
        

        其中任何一个都没有反斜杠字符。所以你正在寻找的正则表达式不需要匹配反斜杠和引号,只需一个引号:

        modified = re.sub("['\"]", 'thevalue', Long_string)
        

        顺便说一句:您也不必在使用正则表达式之前对其进行编译,re.sub 将接受字符串正则表达式以及已编译的正则表达式。

        【讨论】:

        • 嘿,谢谢回答,但我认为我的问题有点不同:因为长字符串实际上是一个 txt 文件,我认为问题出在其他地方
        • 不,它不起作用,这是我的错,因为长字符串应该有这个值 longstring = '''some 'long' string \' and \" some 'escaped' strings''' and i只想修改前面有反斜杠的那个(包括反斜杠),如果我按照你说的去做,它将替换所有引号。
        【解决方案5】:

        这是你想要的吗?

        import re
        Long_string = "some long string \' and \" some escaped strings"
        value_to_change = re.compile( "'|\"" )
        modified = re.sub(value_to_change , 'thevalue' , Long_string )
        print modified 
        

        【讨论】:

        • 不,它不起作用,这是我的错,因为长字符串应该有这个值 longstring = "some 'long' string \' and \" some 'escaped' strings" 我只想修改前面有反斜杠的那个(包括反斜杠)如果我按照你说的做,它将替换所有引号。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-13
        • 2022-01-27
        相关资源
        最近更新 更多