Wie kann ich erste und letzte doppelte Anführungszeichen entfernen?

102

Ich möchte doppelte Anführungszeichen entfernen von:

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

erhalten:

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

Ich habe versucht , zu verwenden rstrip, lstripund , strip('[^\"]|[\"$]')aber es hat nicht funktioniert.

Wie kann ich das machen?

Walapa
quelle
5
Die richtigen Antworten sind unten angegeben. Wie für Ihren Ansatz mit strip, beachten Sie bitte , dass a) diese Methode nicht einen regulären Ausdruck als Argument übernimmt, b) die regex Sie geliefert würde sowieso und c nicht gearbeitet haben) diese Methode entfernt alle benachbarten Zeichen, nicht nur eine, so Sie hätten zwei doppelte Anführungszeichen mit verloren .strip('"').
Tim Pietzcker

Antworten:

188

Wenn die Anführungszeichen, die Sie entfernen möchten, immer "zuerst und zuletzt" sind, wie Sie gesagt haben, können Sie einfach Folgendes verwenden:

string = string[1:-1]

houbysoft
quelle
Der unten ist sicherer!
R Claven
93

Wenn Sie nicht davon ausgehen können, dass alle von Ihnen verarbeiteten Zeichenfolgen doppelte Anführungszeichen haben, können Sie Folgendes verwenden:

if string.startswith('"') and string.endswith('"'):
    string = string[1:-1]

Bearbeiten:

Ich bin sicher, dass Sie hier nur stringals Variablennamen zur Veranschaulichung verwendet haben und in Ihrem realen Code einen nützlichen Namen haben, aber ich fühle mich verpflichtet, Sie zu warnen, dass stringin den Standardbibliotheken ein Modul benannt ist . Es wird nicht automatisch geladen, aber wenn Sie es jemals verwenden, import stringstellen Sie sicher, dass Ihre Variable es nicht verdunkelt.

tgray
quelle
1
Wenn der String '"' ist (nur ein doppeltes Anführungszeichen), wird das einzelne Zeichen entfernt. Ich denke, dies ist wahrscheinlich nicht das, was gewünscht wird. Wahrscheinlich wollte Walapa das doppelte Anführungszeichen nur entfernen, wenn es übereinstimmte.
dbn
44

So entfernen Sie das erste und das letzte Zeichen und entfernen es jeweils nur, wenn es sich bei dem betreffenden Zeichen um ein doppeltes Anführungszeichen handelt:

import re

s = re.sub(r'^"|"$', '', s)

Beachten Sie, dass sich das RE-Muster von dem von Ihnen angegebenen unterscheidet und die Operation sub("Ersatz") mit einer leeren Ersatzzeichenfolge ist ( stripeine Zeichenfolgenmethode, die sich jedoch von Ihren Anforderungen unterscheidet, wie andere Antworten angegeben haben).

Alex Martelli
quelle
4
Die Verwendung eines RE hier ist meiner Meinung nach übertrieben. Ich bevorzuge die Lösung mit startsWith.
Pihentagy
19
Viele Pythonisten reagieren ähnlich wie REs, die wirklich ungerechtfertigt sind - REs sind ziemlich schnell. Außerdem bewirkt die Lösung, die Sie "bevorzugen", wie veröffentlicht, etwas völlig anderes (entfernt das erste und letzte Zeichen nur, wenn beide doppelte Anführungszeichen sind - was sich von den Spezifikationen des OP zu unterscheiden scheint) - wenn führende und nachfolgende Anführungszeichen (falls vorhanden) muss unabhängig entfernt werden, diese Lösung wird zu einem Block mit 4 Anweisungen und 2 Bedingungen - jetzt ist das übertrieben im Vergleich zu einem einzelnen, schnelleren Ausdruck für denselben Job! -)
Alex Martelli
44

WICHTIG: Ich erweitere die Frage / Antwort, um einfache oder doppelte Anführungszeichen zu entfernen. Und ich interpretiere die Frage so, dass BEIDE Zitate vorhanden und übereinstimmend sein müssen, um den Streifen auszuführen. Andernfalls wird die Zeichenfolge unverändert zurückgegeben.

Um eine Zeichenfolgendarstellung zu "dequoteieren", die entweder einfache oder doppelte Anführungszeichen enthält (dies ist eine Erweiterung der Antwort von @ 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

Erläuterung:

startswithkann ein Tupel nehmen, um eine von mehreren Alternativen zu finden. Der Grund für die DOPPELTEN Klammern ((und ))ist, dass wir EINEN Parameter ("'", '"')an übergeben startswith(), um die zulässigen Präfixe anstelle von ZWEI Parametern anzugeben, "'"und '"'die als Präfix und (ungültige) Startposition interpretiert würden.

s[-1] ist das letzte Zeichen in der Zeichenfolge.

Testen:

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"

(Für mich sind Regex-Ausdrücke nicht offensichtlich zu lesen, daher habe ich nicht versucht, die Antwort von @ Alex zu erweitern.)

ToolmakerSteve
quelle
1
Wenn Sie zuerst überprüfen, ob das erste und das letzte Zeichen identisch sind, müssen Sie nur überprüfen, ob das erste Zeichen ein Anführungszeichen ist: def strip_if_quoted (name): if name [0] == name [-1] und name [0 ] in ("'",' "'): Name zurückgeben [1: -1]
TomOnTime
@ TomOnTime: Sie haben Recht, das ist eine gute Optimierung. Ich habe es angewendet.
ToolmakerSteve
4
Ich würde empfehlen, Zeichenfolgen mit maximal 2 Zeichen zu behandeln. Im Moment kann diese Funktion eine Indexausnahme außerhalb der Grenzen für eine Zeichenfolge der Länge 0 auslösen. Außerdem können Sie ein Zitat aus einer Zeichenfolge mit einer Länge von 1 Zeichen entfernen. Sie könnten eine Wache len(s) >= 2oder ähnliches hinzufügen .
BrennanR
14

Wenn der String immer so ist, wie Sie ihn zeigen:

string[1:-1]
Larry
quelle
9

Fast fertig. Zitieren von http://docs.python.org/library/stdtypes.html?highlight=strip#str.strip

Das Argument chars ist eine Zeichenfolge, die den zu entfernenden Zeichensatz angibt.

[...]

Das Argument chars ist kein Präfix oder Suffix. Vielmehr werden alle Kombinationen seiner Werte entfernt:

Das Argument ist also kein regulärer Ausdruck.

>>> string = '"" " " ""\\1" " "" ""'
>>> string.strip('"')
' " " ""\\1" " "" '
>>> 

Beachten Sie, dass dies nicht genau das ist, was Sie angefordert haben, da es mehrere Anführungszeichen von beiden Enden der Zeichenfolge frisst!

pihentagy
quelle
Erfüllt perfekt meinen Zweck! Vielen Dank.
Harsh Wardhan
4

Wenn Sie sicher sind, dass es am Anfang und am Ende ein "gibt, das Sie entfernen möchten, tun Sie einfach:

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

oder

string = string[1:-1]
TooAngel
quelle
2

Entfernen Sie eine bestimmte Zeichenfolge vom Anfang und Ende einer Zeichenfolge.

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

> 'Hello World'
nsantana
quelle
1

Ich habe einen Code, der einfache oder doppelte Anführungszeichen entfernen muss, und ich kann ihn nicht einfach ast.literal_eval.

if len(arg) > 1 and arg[0] in ('"\'') and arg[-1] == arg[0]:
    arg = arg[1:-1]

Dies ähnelt der Antwort von ToolmakerSteve, erlaubt jedoch Zeichenfolgen mit einer Länge von 0 und verwandelt das einzelne Zeichen nicht "in eine leere Zeichenfolge.

dbn
quelle
0

In Ihrem Beispiel könnten Sie Streifen verwenden, aber Sie müssen den Platz bereitstellen

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

Beachten Sie, dass das \ 'in der Ausgabe die Standard-Python-Anführungszeichen für die Zeichenfolgenausgabe sind

Der Wert Ihrer Variablen ist '\\ 1'.

RomainL.
quelle
0

Die folgende Funktion entfernt die leeren Leerzeichen und gibt die Zeichenfolgen ohne Anführungszeichen zurück. Wenn keine Anführungszeichen vorhanden sind, wird dieselbe Zeichenfolge zurückgegeben (entfernt).

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
Sumer
quelle
0

Ab Python 3.9können Sie verwenden removeprefixund removesuffix:

'"" " " ""\\1" " "" ""'.removeprefix('"').removesuffix('"')
# '" " " ""\\1" " "" "'
Xavier Guihot
quelle
-1

Finden Sie die Position des ersten und des letzten "in Ihrer Zeichenfolge

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

>>> s[l+1:r]
'" " " ""\\1" " "" "'
remosu
quelle