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?


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]


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.


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).


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.)


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]

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!


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]

2

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

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

> 'Hello World'

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.


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'


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


-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" " "" "'
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.