如何删除第一双和最后一个双引号?


102

我想从中删除双引号:

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

获得:

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

我试图用rstriplstripstrip('[^\"]|[\"$]')但没有奏效。

我怎样才能做到这一点?


5
正确答案如下。至于您使用的方法strip,请注意:a)此方法不使用正则表达式作为参数,b)您提供的正则表达式仍然无法正常工作,并且c)此方法会剥离所有相邻字符,而不仅仅是一个字符,因此您可能会丢失两个双引号.strip('"')
Tim Pietzcker 2010年

Answers:


188

如果您要去除的引号总是像您所说的那样“第一和最后”,那么您可以简单地使用:

string = string[1:-1]


下面的一个更安全!
R Claven '16

93

如果您不能假设您处理的所有字符串都带有双引号,则可以使用如下所示的内容:

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

编辑:

我确定您只是string在此处用作示例的变量名,并且在您的真实代码中它具有有用的名称,但是我不得不警告您string在标准库中有一个名为模块的模块。它不会自动加载,但是如果您曾经使用过,请import string确保您的变量不会使其黯然失色。


1
如果string为'“'(仅用一个双引号引起来),这将删除单个字符。我认为这可能不是所需要的,也许Walapa只想删除匹配的双引号。–
dbn

44

要删除第一个和最后一个字符,并且仅在所讨论的字符为双引号的情况下,才分别删除:

import re

s = re.sub(r'^"|"$', '', s)

请注意,RE模式与您给定的RE模式不同,并且操作sub(用空格替换字符串)(“替代”)(strip是字符串方法,但与您的要求有所不同,如其他答案所示)。


4
在这里使用RE是恕我直言。我更喜欢用的解决方案startsWith
pihentagy

19
许多Pythonista用户对RE的反应相似,这实际上是没有道理的-RE相当快。另外,您发布的“首选”解决方案会做一些完全不同的操作(仅当两个引号都用双引号时才删除第一个和最后一个字符-这似乎与OP的规范不同)-如果使用前导和尾随引号(如果存在)需要被独立地除去,即溶液变成4语句,2-条件语句块-现在 “相比单,更快的表达同样的工作小号矫枉过正! - )
亚历马尔泰利

44

重要说明:我正在扩展问题/答案以去除单引号或双引号。我将问题解释为必须同时存在两个引号,并且两个引号都必须匹配才能执行删除操作。否则,字符串将保持不变。

要“取消引用”字符串表示形式,该字符串表示形式周围可能带有单引号或双引号(这是@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, return the string unchanged.
    """
    if (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的答案。)


1
如果首先检查第一个字符和最后一个字符是否相同,则只需要检查第一个字符是否为引号:def strip_if_quoted(name):if name [0] == name [-1]和name [0 ] in(“”“,'”'):返回名称[1:-1]
TomOnTime 2014年

@TomOnTime:对,这是一个很好的优化。我已经申请了
ToolmakerSteve

4
我建议处理不超过2个字符的字符串。现在,此函数可以为长度为0的字符串抛出索引超出范围的异常。此外,您可以从长度为1个字符的字符串中删除引号。您可以添加一个警卫len(s) >= 2或类似的东西。
BrennanR 2015年

15

如果字符串始终如您所显示:

string[1:-1]

9

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

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

[...]

chars参数不是前缀或后缀;而是删除其值的所有组合:

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

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

注意,这并不是您所要求的,因为它在字符串的两端都使用了多个引号!


完全达到我的目的!非常感谢。
严厉的沃德汉,2013年

4

如果您确定要删除的开头和结尾处有一个“,请执行以下操作:

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

要么

string = string[1:-1]

2

从字符串的开头和结尾删除确定的字符串。

s = '""Hello World""'
s.strip('""')

> 'Hello World'

1

我有一些代码需要去除单引号或双引号,而我不能简单地ast.literal_eval。

if len(arg) > 1 and arg[0] in ('"\'') and arg[-1] == arg[0]:
    arg = arg[1:-1]

这类似于ToolmakerSteve的答案,但是它允许长度为0的字符串,并且不能将单个字符"转换为空字符串。


0

在您的示例中,您可以使用地带,但必须提供空间

string = '"" " " ""\\1" " "" ""'
string.strip('" ')  # output '\\1'

注意输出中的\是字符串输出的标准python引号

您的变量的值为'\\ 1'


0

下面的函数将去除空的spces并返回不带引号的字符串。如果没有引号,它将返回相同的字符串(剥离)

def removeQuote(str):
str = str.strip()
if re.search("^[\'\"].*[\'\"]$",str):
    str = str[1:-1]
    print("Removed Quotes",str)
else:
    print("Same String",str)
return str


-1

在字符串中找到第一个和最后一个“的位置

>>> s = '"" " " ""\\1" " "" ""'
>>> l = s.find('"')
>>> r = s.rfind('"')

>>> s[l+1:r]
'" " " ""\\1" " "" "'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.