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

6

我该如何在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'''
5个回答

12

你是如何做到的

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

如果这些是你文件的内容(如图所示的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有些人遇到问题时,会想:“我知道了,我将使用正则表达式。”现在他们有两个问题。


这让我的一天都变好了:“有些人遇到问题时,会想‘我知道,我用正则表达式来解决它。’现在他们有两个问题了。” :-D - Jay

3
问题在于在您的字符串中,\' 和 \" 会被转换为 ' 和 ",因此在您的示例中,您将无法仅匹配 \' 而不匹配 long 两侧的单引号。
但是,我的理解是这个数据来自一个文件,所以假设您有包含此类数据的 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))

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

2

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

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将接受字符串正则表达式和已编译的正则表达式。


嘿,谢谢你的回答,但是我认为我的问题有点不同:因为长字符串实际上是一个文本文件,我认为问题出在其他地方。 - Florin
不行,这是我的错,因为长字符串应该有这个值longstring ='''some 'long' string ' and " some 'escaped' strings''',我只想修改带有反斜杠的那个(包括反斜杠)。如果按照你说的做,它会替换所有引号。 - Florin

1

这可能是你想要的:

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 =“一些'长'字符串\ '和\“一些'转义'字符串”,我只想修改带有反斜杠的那个(包括反斜杠)。如果我按照你说的做,它会替换所有引号。 - Florin

1
我尝试使用以下代码(Python 3)打印单个反斜杠:

print("\\")

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

希望这能有所帮助!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接