Come posso rimuovere la prima e l'ultima virgoletta doppia?


102

Voglio rimuovere le virgolette doppie da:

string = '"" " " ""\\1" " "" ""'

ottenere:

string = '" " " ""\\1" " "" "'

Ho cercato di usare rstrip, lstripe strip('[^\"]|[\"$]')ma non ha funzionato.

Come posso fare questo?


5
Le risposte corrette sono fornite di seguito. Per quanto riguarda il tuo approccio 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('"').
Tim Pietzcker

Risposte:


188

Se le virgolette che vuoi rimuovere saranno sempre "prime e ultime" come hai detto, allora potresti semplicemente usare:

string = string[1:-1]


Quello qui sotto è più sicuro!
R Claven

93

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 stringcome 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 stringnelle librerie standard. Non viene caricato automaticamente, ma se mai lo usi import stringassicurati che la tua variabile non la eclissi.


1
Se la stringa è '"' (solo una virgoletta doppia), questo rimuoverà il carattere singolo. Penso che questo probabilmente non sia ciò che si desidera, probabilmente Walapa voleva rimuovere solo le virgolette doppie se era abbinata.
dbn

44

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


4
Usare un RE qui è eccessivo IMHO. Preferisco la soluzione con startsWith.
pihentagy

19
Molti Pythonistas hanno reazioni simili alle RE, che sono davvero ingiustificate: le RE sono abbastanza veloci. Inoltre, la soluzione che "preferisci", come pubblicata, fa qualcosa di completamente diverso (rimuove il primo e l'ultimo carattere solo se entrambi sono doppi apici - il che sembra diverso dalle specifiche dell'OP) - se le virgolette iniziali e finali (quando presenti) occorre eliminare, in modo indipendente, che la soluzione diventa un 4-dichiarazioni, blocco 2-condizionali - ora che 's eccessivo rispetto ad un singolo, più veloce espressione per lo stesso lavoro -!)
Alex Martelli

44

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:

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


1
Se controlli prima che il primo e l'ultimo carattere siano uguali, devi solo controllare se il primo carattere è una citazione: def strip_if_quoted (name): if name [0] == name [-1] and name [0 ] in ("'",' "'): return name [1: -1]
TomOnTime

@ TomOnTime: hai ragione, questa è una buona ottimizzazione. L'ho applicato.
ToolmakerSteve

4
Consiglierei di gestire stringhe di 2 caratteri o meno. In questo momento questa funzione può generare un'eccezione di indice fuori dai limiti per una stringa di lunghezza 0. Inoltre, è possibile rimuovere una citazione da una stringa lunga 1 carattere. Potresti aggiungere una guardia len(s) >= 2o qualcosa di simile.
BrennanR

15

Se la stringa è sempre come mostri:

string[1:-1]

9

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!


Serve perfettamente al mio scopo! Molte grazie.
Harsh Wardhan

4

Se sei sicuro che ci sia un "all'inizio e alla fine, che vuoi rimuovere, fai:

string = string[1:len(string)-1]

o

string = string[1:-1]

2

Rimuove una stringa determinata dall'inizio e dalla fine da una stringa.

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

> 'Hello World'

1

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.


0

nel tuo esempio potresti usare strip ma devi fornire lo spazio

string = '"" " " ""\\1" " "" ""'
string.strip('" ')  # output '\\1'

nota che \ 'nell'output sono le virgolette standard di Python per l'output di stringa

il valore della tua variabile è "\\ 1"


0

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


-1

trova la posizione del primo e dell'ultimo "nella stringa

>>> s = '"" " " ""\\1" " "" ""'
>>> l = s.find('"')
>>> r = s.rfind('"')

>>> s[l+1:r]
'" " " ""\\1" " "" "'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.