Risposte:
Se non puoi presumere che tutte le stringhe che elabori abbiano virgolette doppie, puoi usare qualcosa del genere:
if string.startswith('"') and string.endswith('"'):
string = string[1:-1]
Modificare:
Sono sicuro che hai usato solo string
come nome della variabile per esemplificazione qui e nel tuo codice reale ha un nome utile, ma mi sento obbligato ad avvertirti che c'è un modulo chiamato string
nelle librerie standard. Non viene caricato automaticamente, ma se mai lo usi import string
assicurati che la tua variabile non la eclissi.
Per rimuovere il primo e l'ultimo carattere, e in ogni caso eseguire la rimozione solo se il carattere in questione è una virgoletta doppia:
import re
s = re.sub(r'^"|"$', '', s)
Nota che il modello RE è diverso da quello che avevi fornito e l'operazione è sub
("sostituisci") con una stringa di sostituzione vuota ( strip
è un metodo di stringa ma fa qualcosa di molto diverso dai tuoi requisiti, come hanno indicato altre risposte).
startsWith
.
IMPORTANTE: sto estendendo la domanda / risposta per eliminare virgolette singole o doppie. E interpreto la domanda nel senso che ENTRAMBE le virgolette devono essere presenti e corrispondenti per eseguire la striscia. In caso contrario, la stringa viene restituita invariata.
Per "dequotare" una rappresentazione di stringa, che potrebbe contenere virgolette singole o doppie (questa è un'estensione della risposta di @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
Spiegazione:
startswith
può richiedere una tupla per trovare una qualsiasi delle diverse alternative. Il motivo delle parentesi DOPPIE ((
ed ))
è che passiamo UN parametro ("'", '"')
a startswith()
, per specificare i prefissi consentiti, piuttosto che DUE parametri "'"
e '"'
, che verrebbero interpretati come un prefisso e una posizione iniziale (non valida).
s[-1]
è l'ultimo carattere della stringa.
test:
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"
(Per me, le espressioni regex non sono ovvie da leggere, quindi non ho provato a estendere la risposta di @Alex.)
len(s) >= 2
o qualcosa di simile.
Quasi fatto. Citando da http://docs.python.org/library/stdtypes.html?highlight=strip#str.strip
L'argomento chars è una stringa che specifica il set di caratteri da rimuovere.
[...]
L'argomento chars non è un prefisso o un suffisso; piuttosto, tutte le combinazioni dei suoi valori vengono rimosse:
Quindi l'argomento non è una regexp.
>>> string = '"" " " ""\\1" " "" ""'
>>> string.strip('"')
' " " ""\\1" " "" '
>>>
Nota che questo non è esattamente quello che hai richiesto, perché mangia più virgolette da entrambe le estremità della stringa!
Ho del codice che deve rimuovere virgolette singole o doppie e non posso semplicemente ast.literal_eval.
if len(arg) > 1 and arg[0] in ('"\'') and arg[-1] == arg[0]:
arg = arg[1:-1]
È simile alla risposta di ToolmakerSteve, ma consente stringhe di lunghezza 0 e non trasforma il singolo carattere "
in una stringa vuota.
La funzione sotto rimuoverà le parti vuote e restituirà le stringhe senza virgolette. Se non ci sono virgolette, restituirà la stessa stringa (rimossa)
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
A partire da Python 3.9
, puoi usare removeprefix
e removesuffix
:
'"" " " ""\\1" " "" ""'.removeprefix('"').removesuffix('"')
# '" " " ""\\1" " "" "'
strip
, tieni presente che a) questo metodo non accetta un'espressione regolare come argomento, b) la regex che hai fornito non avrebbe funzionato comunque ec) questo metodo rimuove tutti i caratteri adiacenti, non solo uno, quindi avresti perso due virgolette doppie con.strip('"')
.