Como posso retirar a primeira e a última aspas duplas?

102

Quero retirar aspas duplas de:

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

obter:

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

Eu tentei usar rstrip, lstripe strip('[^\"]|[\"$]')mas não funcionou.

Como posso fazer isso?

Walapa
fonte
5
As respostas corretas são fornecidas abaixo. Quanto à sua abordagem com strip, observe que a) este método não leva uma regex como seu argumento, b) a regex que você forneceu não teria funcionado de qualquer maneira ec) este método remove todos os caracteres adjacentes, não apenas um, então você teria perdido duas aspas duplas com .strip('"').
Tim Pietzcker

Respostas:

188

Se as aspas que você deseja remover sempre serão "as primeiras e as últimas" como você disse, você pode simplesmente usar:

string = string[1:-1]

houbysoft
fonte
O que está abaixo é mais seguro!
R Claven
93

Se você não pode presumir que todas as strings que processa têm aspas duplas, você pode usar algo assim:

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

Editar:

Tenho certeza que você acabou de usar stringcomo nome de variável para exemplificação aqui e em seu código real tem um nome útil, mas me sinto obrigado a avisar que existe um módulo nomeado stringnas bibliotecas padrão. Não é carregado automaticamente, mas se você usar, import stringcertifique-se de que sua variável não o eclipse.

tgray
fonte
1
Se a string for '"' (apenas uma aspa dupla), isso removerá o caractere único. Acho que provavelmente não é o que é desejado, provavelmente Walapa queria remover apenas as aspas duplas se correspondesse.
dbn
44

Para remover o primeiro e o último caracteres, e em cada caso, faça a remoção apenas se o caractere em questão for uma aspa dupla:

import re

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

Observe que o padrão RE é diferente do que você deu, e a operação é sub("substituir") com uma string de substituição vazia ( stripé um método de string, mas faz algo muito diferente de seus requisitos, como outras respostas indicaram).

Alex Martelli
fonte
4
Usar um RE aqui é um exagero IMHO. Prefiro a solução com startsWith.
pihentagy
19
Muitos Pythonistas têm reações semelhantes aos REs, que são realmente injustificáveis ​​- REs são bastante rápidos. Além disso, a solução que você "prefere", conforme postado, faz algo completamente diferente (remove o primeiro e o último caractere apenas se ambos forem aspas duplas - o que parece diferente das especificações do OP) - se aspas iniciais e finais (quando presentes) precisa ser removido independentemente, essa solução se torna um bloco de 4 declarações e 2 condicionais - agora isso é um exagero em comparação com uma única expressão mais rápida para o mesmo trabalho! -)
Alex Martelli
44

IMPORTANTE: estou estendendo a pergunta / resposta para retirar as aspas simples ou duplas. E eu interpreto a pergunta como significando que AMBAS as citações devem estar presentes e correspondentes para realizar a tira. Caso contrário, a string é retornada inalterada.

Para "dequote" uma representação de string, que pode ter aspas simples ou duplas (esta é uma extensão da resposta de @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

Explicação:

startswithpode receber uma tupla, para corresponder a qualquer uma das várias alternativas. O motivo dos parênteses DOBRADOS ((e ))é que passamos UM parâmetro ("'", '"')para startswith(), para especificar os prefixos permitidos, em vez de DOIS parâmetros "'"e '"', que seriam interpretados como um prefixo e uma posição inicial (inválida).

s[-1] é o último caractere da string.

Teste:

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"

(Para mim, as expressões regex não são óbvias de ler, então não tentei estender a resposta de @Alex.)

ToolmakerSteve
fonte
1
Se você verificar primeiro se o primeiro e o último caractere são iguais, você só precisa verificar se o primeiro caractere é uma citação: def strip_if_quoted (name): if name [0] == name [-1] and name [0 ] in ("'",' "'): nome de retorno [1: -1]
TomOnTime
@TomOnTime: Você está certo, essa é uma boa otimização. Eu apliquei isso.
Toolmaker Steve
4
Eu recomendo lidar com strings de 2 caracteres ou menos. No momento, esta função pode lançar uma exceção de índice fora dos limites para uma string de comprimento 0. Além disso, você pode retirar uma citação de uma string de 1 caractere. Você pode adicionar um guarda len(s) >= 2, ou algo semelhante.
BrennanR
15

Se a string é sempre como você mostra:

string[1:-1]
Larry
fonte
9

Quase pronto. Citando http://docs.python.org/library/stdtypes.html?highlight=strip#str.strip

O argumento chars é uma string que especifica o conjunto de caracteres a ser removido.

[...]

O argumento chars não é um prefixo ou sufixo; em vez disso, todas as combinações de seus valores são removidas:

Portanto, o argumento não é um regexp.

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

Observe que isso não é exatamente o que você solicitou, porque ele come várias aspas de ambas as extremidades da string!

pihentagy
fonte
Atende perfeitamente ao meu propósito! Muito obrigado.
Harsh Wardhan
4

Se você tiver certeza de que há um "no início e no final, que deseja remover, basta fazer:

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

ou

string = string[1:-1]
TooAngel
fonte
2

Remova uma string determinada do início e do fim de uma string.

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

> 'Hello World'
nsantana
fonte
1

Eu tenho alguns códigos que precisam remover aspas simples ou duplas e não posso simplesmente ast.literal_eval.

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

Isso é semelhante à resposta de ToolmakerSteve, mas permite strings de comprimento 0 e não transforma o caractere único "em uma string vazia.

dbn
fonte
0

no seu exemplo, você pode usar tira, mas deve fornecer o espaço

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

observe que o \ 'na saída são as aspas padrão do Python para a saída da string

o valor da sua variável é '\\ 1'

RomainL.
fonte
0

A função abaixo removerá os espaços vazios e retornará as strings sem aspas. Se não houver aspas, ele retornará a mesma string (removida)

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
verão
fonte
0

Começando em Python 3.9, você pode usar removeprefixe removesuffix:

'"" " " ""\\1" " "" ""'.removeprefix('"').removesuffix('"')
# '" " " ""\\1" " "" "'
Xavier Guihot
fonte
-1

encontre a posição do primeiro e do último "em sua string

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

>>> s[l+1:r]
'" " " ""\\1" " "" "'
remosu
fonte