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 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.
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:
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.)
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 removeprefixe 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('"').