Respostas:
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 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 nomeado string
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.
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).
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):
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:
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 ("'", '"')
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.)
len(s) >= 2
, ou algo semelhante.
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!
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.
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
Começando em Python 3.9
, você pode usar removeprefix
e removesuffix
:
'"" " " ""\\1" " "" ""'.removeprefix('"').removesuffix('"')
# '" " " ""\\1" " "" "'
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('"')
.