如何去掉字符串开头和结尾的双引号?

120

我想从以下内容中去除双引号:

string = '"" " " ""\\1" " "" ""'

获得:

string = '" " " ""\\1" " "" "'
我尝试使用 rstriplstripstrip('[^\"]|[\"$]'),但它没有起作用。
我该怎么做?

6
正确答案如下。关于您使用strip的方法,请注意:a)该方法不接受正则表达式作为其参数;b)您提供的正则表达式本来也不会起作用;c)该方法删除所有相邻字符,而不仅仅是一个,因此您将失去两个双引号,即使使用.strip('"') - Tim Pietzcker
13个回答

217
如果您要去掉的引号总是“首尾”,那么您可以简单地使用以下方式: string = string[1:-1]

2
下面这个更安全! - R Claven

113

如果您无法假设您处理的所有字符串都具有双引号,则可以使用类似于此的内容:

if string.startswith('"') and string.endswith('"'):
    string = string[1:-1]

编辑:

我确信你在这里只是举例使用了string作为变量名,并且在你的真实代码中它有一个有用的名称,但我感到有义务提醒你标准库中有一个名为string的模块。它不会被自动加载,但如果你以后使用import string,请确保你的变量不会与之冲突。


1
如果字符串是 '"'(只有一个双引号),这将删除单个字符。我认为这可能不是所需的,Walapa可能只想在匹配时删除双引号。 - dbn

57

重要提示:我正在扩展问题/答案以去除单引号或双引号。我将解释该问题的意思是必须同时存在且匹配两个引号才能执行去除操作。否则,字符串将保持不变。

为了“去除引号”一个可能包含单引号或双引号的字符串表示(这是@tgray的答案的扩展):

def dequote(s):
    """
    If a string has single or double quotes around it, remove them.
    Make sure the pair of quotes match.
    If a matching pair of quotes is not found,
    or there are less than 2 characters, return the string unchanged.
    """
    if (len(s) >= 2 and s[0] == s[-1]) and s.startswith(("'", '"')):
        return s[1:-1]
    return s

解释:

startswith 可以接受一个元组,以匹配多个替代内容。使用双重括号(()) 的原因是为了将参数("'", '"') 作为一个整体传递给startswith(),以指定允许的前缀,而不是解释为两个参数"'"'"',这会被解释为一个前缀和一个(无效的)起始位置。

s[-1] 是字符串中的最后一个字符。

测试:

print( dequote("\"he\"l'lo\"") )
print( dequote("'he\"l'lo'") )
print( dequote("he\"l'lo") )
print( dequote("'he\"l'lo\"") )
he"l'lo
he"l'lo
he"l'lo
'he"l'lo"

对我来说,正则表达式很难理解,所以我没有尝试扩展@Alex的答案。


2
如果您首先检查第一个和最后一个字符是否相同,那么您只需要检查第一个字符是否为引号: def strip_if_quoted(name): if name[0] == name[-1] and name[0] in ("'", '"'): return name[1:-1] - TomOnTime
@TomOnTime:你是对的,那是一个很好的优化。我已经应用它了。 - ToolmakerSteve
7
我建议处理长度为2个字符或更少的字符串。目前,如果输入一个长度为0的字符串,该函数可能会抛出下标越界异常。此外,对于长度为1的字符串,您可以去掉其中一个引号。您可以添加一个守卫条件 len(s) >= 2 或类似的条件。 - BrennanR
很棒的建议!问题已经编辑并添加了。 - ToolmakerSteve

51

要删除字符串的首尾字符,但仅在该字符为双引号时执行删除:

import re

s = re.sub(r'^"|"$', '', s)
请注意,正则表达式模式与您提供的不同,并且操作是使用空替换字符串的“sub”(“替换”)操作(“strip”是一个字符串方法,但与您的要求非常不同,正如其他答案所指出的那样)。

4
我认为在这里使用正则表达式有些过头了。我更喜欢使用 startsWith 的解决方案。 - pihentagy
25
许多Python程序员对正则表达式有类似的反应,这是不合理的 -- 正则表达式非常快速。此外,你“喜欢”的解决方案会执行完全不同的操作(仅在两个引号都为双引号时才删除第一个和最后一个字符 -- 这似乎与 OP 的规格不同)-- 如果需要独立地删除前导和尾随引号(如果存在),那么该解决方案将变成一个包含4条语句和2个条件块的代码块--与执行相同任务的单个更快表达式相比,这就过度了!-) - Alex Martelli

16

如果字符串总是像你展示的那样:

string[1:-1]

8

快完成了。引用自http://docs.python.org/library/stdtypes.html?highlight=strip#str.strip

chars参数是一个字符串,指定要删除的字符集。

[...]

chars参数不是前缀或后缀;相反,它的所有值的组合都被剥离:

因此该参数不是正则表达式。

>>> string = '"" " " ""\\1" " "" ""'
>>> string.strip('"')
' " " ""\\1" " "" '
>>> 

请注意,这并不完全符合您的要求,因为它会从字符串两端吞噬多个引号!

5

Python 3.9 开始,您可以使用 removeprefixremovesuffix 方法:

'"" " " ""\\1" " "" ""'.removeprefix('"').removesuffix('"')
# '" " " ""\\1" " "" "'

5
从字符串的开头和结尾删除一个确定的字符串。
s = '""Hello World""'
s.strip('""')

> 'Hello World'

绝对是最容易实现的答案!但为什么要用双倍引号? - Erik Knowles
你是对的!我必须使用这个问题示例。现在看来,我发现这个示例对于这个问题是不正确的,因为它没有保留一个双引号。 - nsantana

4

如果您确定字符串开头和结尾处都有引号需要移除,只需执行以下操作:

string = string[1:len(string)-1]

或者
string = string[1:-1]

1
在你的例子中,你可以使用strip函数,但是你需要提供空格。
string = '"" " " ""\\1" " "" ""'
string.strip('" ')  # output '\\1'

请注意,输出中的\'是Python字符串输出的标准引号。
您的变量值为'\\1'。

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