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:
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.
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).
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).
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.
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('"')
.Respostas:
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]
fonte
Se você não pode presumir que todas as strings que processa têm aspas duplas, você pode usar algo assim:
Editar:
Tenho certeza que você acabou de usar
string
como 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 nomeadostring
nas bibliotecas padrão. Não é carregado automaticamente, mas se você usar,import string
certifique-se de que sua variável não o eclipse.fonte
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:
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).fonte
startsWith
.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):
Explicação:
startswith
pode receber uma tupla, para corresponder a qualquer uma das várias alternativas. O motivo dos parênteses DOBRADOS((
e))
é que passamos UM parâmetro("'", '"')
parastartswith()
, 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:
=>
(Para mim, as expressões regex não são óbvias de ler, então não tentei estender a resposta de @Alex.)
fonte
len(s) >= 2
, ou algo semelhante.Se a string é sempre como você mostra:
fonte
Quase pronto. Citando http://docs.python.org/library/stdtypes.html?highlight=strip#str.strip
[...]
Portanto, o argumento não é um regexp.
Observe que isso não é exatamente o que você solicitou, porque ele come várias aspas de ambas as extremidades da string!
fonte
Se você tiver certeza de que há um "no início e no final, que deseja remover, basta fazer:
ou
fonte
Remova uma string determinada do início e do fim de uma string.
fonte
Eu tenho alguns códigos que precisam remover aspas simples ou duplas e não posso simplesmente ast.literal_eval.
Isso é semelhante à resposta de ToolmakerSteve, mas permite strings de comprimento 0 e não transforma o caractere único
"
em uma string vazia.fonte
no seu exemplo, você pode usar tira, mas deve fornecer o espaço
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'
fonte
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)
fonte
Começando em
Python 3.9
, você pode usarremoveprefix
eremovesuffix
:fonte
encontre a posição do primeiro e do último "em sua string
fonte