Chcę usunąć podwójne cudzysłowy z:
string = '"" " " ""\\1" " "" ""'
pozyskać:
string = '" " " ""\\1" " "" "'
Starałem się używać rstrip
, lstrip
a strip('[^\"]|[\"$]')
ale to nie działa.
W jaki sposób mogę to zrobić?
Odpowiedzi:
Jeśli nie możesz założyć, że wszystkie przetwarzane ciągi mają podwójne cudzysłowy, możesz użyć czegoś takiego:
if string.startswith('"') and string.endswith('"'):
string = string[1:-1]
Edytować:
Jestem pewien, że właśnie użyłeś string
tutaj nazwy zmiennej dla przykładu, aw twoim prawdziwym kodzie ma ona użyteczną nazwę, ale czuję się zobowiązany do ostrzeżenia, że istnieje moduł o nazwie string
w standardowych bibliotekach. Nie jest ładowany automatycznie, ale jeśli kiedykolwiek użyjesz, import string
upewnij się, że zmienna go nie przyćmiewa.
Aby usunąć pierwszy i ostatni znak, aw każdym przypadku należy usunąć tylko wtedy, gdy dany znak jest cudzysłowem:
import re
s = re.sub(r'^"|"$', '', s)
Zauważ, że wzorzec RE jest inny niż ten, który podałeś, a operacja polega na sub
(„podstawieniu”) z pustym ciągiem zastępczym ( strip
jest to metoda łańcuchowa, ale robi coś zupełnie innego niż twoje wymagania, jak wskazywały inne odpowiedzi).
startsWith
.
WAŻNE: rozszerzam pytanie / odpowiedź, aby usunąć pojedyncze lub podwójne cudzysłowy. I interpretuję to pytanie tak, że oba cytaty muszą być obecne i dopasowane, aby wykonać pasek. W przeciwnym razie ciąg jest zwracany bez zmian.
Aby „usunąć cudzysłowy” reprezentację ciągu, która może zawierać pojedyncze lub podwójne cudzysłowy (jest to rozszerzenie odpowiedzi @ 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
Wyjaśnienie:
startswith
może wziąć krotkę, aby dopasować dowolną z kilku alternatyw. Powodem DOUBLED nawiasów ((
i ))
jest to, że przekazujemy JEDEN parametr ("'", '"')
do startswith()
określenia dozwolonych przedrostków, a nie DWA parametry "'"
i '"'
, które byłyby interpretowane jako przedrostek i (nieprawidłowa) pozycja początkowa.
s[-1]
to ostatni znak w ciągu.
Testowanie:
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"
(Dla mnie wyrażenia regex nie są oczywiste do odczytania, więc nie próbowałem rozszerzać odpowiedzi @ Alex).
len(s) >= 2
lub coś podobnego.
Prawie skończone. Cytowanie z http://docs.python.org/library/stdtypes.html?highlight=strip#str.strip
Argument chars jest łańcuchem określającym zestaw znaków do usunięcia.
[…]
Argument chars nie jest przedrostkiem ani sufiksem; raczej wszystkie kombinacje jego wartości są usuwane:
Zatem argument nie jest wyrażeniem regularnym.
>>> string = '"" " " ""\\1" " "" ""'
>>> string.strip('"')
' " " ""\\1" " "" '
>>>
Zauważ, że nie jest to dokładnie to, o co prosiłeś, ponieważ zjada wiele cudzysłowów z obu końców ciągu!
Mam kod, który musi usuwać pojedyncze lub podwójne cudzysłowy, a nie mogę go po prostu ast.literal_eval.
if len(arg) > 1 and arg[0] in ('"\'') and arg[-1] == arg[0]:
arg = arg[1:-1]
Jest to podobne do odpowiedzi ToolmakerSteve, ale zezwala na ciągi o długości 0 i nie zamienia pojedynczego znaku "
w pusty ciąg.
Funkcja poniżej usunie puste elementy i zwróci ciągi bez cudzysłowów. Jeśli nie ma cudzysłowów, zwróci ten sam ciąg (pozbawiony)
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
Począwszy od Python 3.9
, możesz używać removeprefix
i removesuffix
:
'"" " " ""\\1" " "" ""'.removeprefix('"').removesuffix('"')
# '" " " ""\\1" " "" "'
strip
, zwróć uwagę, że a) ta metoda nie przyjmuje wyrażenia regularnego jako argumentu, b) podane wyrażenie regularne i tak nie zadziałałoby ic) ta metoda usuwa wszystkie sąsiadujące znaki, a nie tylko jeden, więc straciłbyś dwa podwójne cudzysłowy z.strip('"')
.