Bagaimana cara menghapus tanda kutip ganda pertama dan terakhir?

102

Saya ingin menghapus tanda kutip ganda dari:

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

untuk memperoleh:

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

Saya mencoba menggunakan rstrip, lstripdan strip('[^\"]|[\"$]')tapi itu tidak bekerja.

Bagaimana saya bisa melakukan ini?

Walapa
sumber
5
Jawaban yang benar diberikan di bawah ini. Untuk pendekatan Anda strip, harap perhatikan bahwa a) metode ini tidak menggunakan regex sebagai argumennya, b) regex yang Anda berikan tidak akan berfungsi dan c) metode ini menghapus semua karakter yang berdekatan, bukan hanya satu, jadi Anda akan kehilangan dua tanda kutip ganda dengan .strip('"').
Tim Pietzcker

Jawaban:

188

Jika tanda kutip yang ingin Anda hapus selalu menjadi "pertama dan terakhir" seperti yang Anda katakan, Anda dapat menggunakan:

string = string[1:-1]

houbysoft
sumber
Yang di bawah ini lebih aman!
R Claven
93

Jika Anda tidak dapat berasumsi bahwa semua string yang Anda proses memiliki tanda kutip ganda, Anda dapat menggunakan sesuatu seperti ini:

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

Edit:

Saya yakin Anda baru saja menggunakan stringnama variabel untuk contoh di sini dan dalam kode asli Anda memiliki nama yang berguna, tetapi saya merasa berkewajiban untuk memperingatkan Anda bahwa ada modul yang diberi nama stringdi pustaka standar. Ini tidak dimuat secara otomatis, tetapi jika Anda pernah menggunakannya, import stringpastikan variabel Anda tidak melebihi itu.

tgray
sumber
1
Jika string adalah '"' (hanya satu tanda kutip ganda), ini akan menghapus karakter tunggal. Saya rasa ini mungkin bukan yang diinginkan, mungkin Walapa hanya ingin menghapus tanda kutip ganda jika cocok.
dbn
44

Untuk menghapus karakter pertama dan terakhir, dan dalam setiap kasus lakukan penghapusan hanya jika karakter yang dimaksud adalah tanda kutip ganda:

import re

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

Perhatikan bahwa pola RE berbeda dari yang Anda berikan, dan operasinya adalah sub("substitusi") dengan string pengganti kosong ( stripadalah metode string tetapi melakukan sesuatu yang sangat berbeda dari persyaratan Anda, seperti yang ditunjukkan oleh jawaban lain).

Alex Martelli
sumber
4
Menggunakan RE di sini adalah IMHO berlebihan. Saya lebih suka solusi dengan startsWith.
pihentagy
19
Banyak Pythonistas memiliki reaksi yang mirip dengan RE, yang sebenarnya tidak dapat dibenarkan - RE cukup cepat. Selain itu, solusi yang Anda "sukai", seperti yang diposting, melakukan sesuatu yang sama sekali berbeda (menghapus karakter pertama dan terakhir hanya jika keduanya adalah tanda kutip ganda - yang tampaknya berbeda dari spesifikasi OP) - jika tanda kutip di depan dan di belakang (jika ada) perlu dihapus secara independen, solusi itu menjadi blok 4 pernyataan, 2-kondisional - sekarang itu berlebihan dibandingkan dengan satu ekspresi yang lebih cepat untuk pekerjaan yang sama! -)
Alex Martelli
44

PENTING: Saya memperluas pertanyaan / jawaban untuk menghapus tanda kutip tunggal atau ganda. Dan saya mengartikan pertanyaan itu berarti bahwa KEDUA tanda kutip harus ada, dan cocok, untuk melakukan strip. Jika tidak, string dikembalikan tanpa perubahan.

Untuk "membatalkan" representasi string, yang mungkin memiliki tanda kutip tunggal atau ganda di sekitarnya (ini adalah perpanjangan dari jawaban @ 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

Penjelasan:

startswithdapat menggunakan tupel, untuk mencocokkan salah satu dari beberapa alternatif. Alasan untuk tanda kurung GANDA ((dan ))adalah agar kita meneruskan SATU parameter ("'", '"')ke startswith(), untuk menentukan prefiks yang diizinkan, bukan DUA parameter "'"dan '"', yang akan ditafsirkan sebagai awalan dan posisi awal (tidak valid).

s[-1] adalah karakter terakhir dalam string.

Pengujian:

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"

(Bagi saya, ekspresi regex tidak jelas untuk dibaca, jadi saya tidak mencoba memperpanjang jawaban @ Alex.)

ToolmakerSteve
sumber
1
Jika Anda pertama kali memeriksa bahwa karakter pertama dan terakhir sama, Anda hanya perlu memeriksa apakah karakter pertama adalah kutipan: def strip_if_quoted (name): if name [0] == name [-1] dan name [0 ] di ("'",' "'): nama kembali [1: -1]
TomOnTime
@TomOnTime: Anda benar, itu adalah pengoptimalan yang bagus. Saya telah menerapkannya.
ToolmakerSteve
4
Saya akan merekomendasikan penanganan string yang terdiri dari 2 karakter atau kurang. Saat ini fungsi ini dapat mengeluarkan indeks di luar batas untuk string dengan panjang 0. Selain itu, Anda dapat menghapus kutipan dari string yang panjangnya 1 karakter. Anda bisa menambahkan penjaga len(s) >= 2,, atau yang serupa.
BrennanR
15

Jika string selalu seperti yang Anda tunjukkan:

string[1:-1]
Larry
sumber
9

Hampir selesai. Mengutip dari http://docs.python.org/library/stdtypes.html?highlight=strip#str.strip

Argumen karakter adalah string yang menentukan kumpulan karakter yang akan dihapus.

[...]

Argumen karakter bukanlah awalan atau sufiks; sebaliknya, semua kombinasi nilainya dilucuti:

Jadi argumennya bukan regexp.

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

Perhatikan, bahwa ini bukan yang Anda minta, karena ia memakan banyak kutipan dari kedua ujung string!

pihentagy
sumber
Dengan sempurna memenuhi tujuan saya! Terima kasih banyak.
Harsh Wardhan
4

Jika Anda yakin ada "di awal dan di akhir, yang ingin Anda hapus, lakukan saja:

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

atau

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

Hapus string yang ditentukan dari awal dan akhir dari string.

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

> 'Hello World'
nsantana
sumber
1

Saya memiliki beberapa kode yang perlu menghapus tanda kutip tunggal atau ganda, dan saya tidak bisa hanya ast.literal_eval itu.

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

Ini mirip dengan jawaban ToolmakerSteve, tetapi memungkinkan 0 string panjang, dan tidak mengubah karakter tunggal "menjadi string kosong.

dbn
sumber
0

dalam contoh Anda, Anda dapat menggunakan strip tetapi Anda harus menyediakan ruang

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

perhatikan \ 'dalam output adalah tanda kutip python standar untuk output string

nilai variabel Anda adalah '\\ 1'

RomainL.
sumber
0

Fungsi di bawah ini akan menghapus spasi kosong dan mengembalikan string tanpa tanda kutip. Jika tidak ada tanda kutip maka akan mengembalikan string yang sama (dilucuti)

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
Sumeria
sumber
0

Mulai Python 3.9, Anda dapat menggunakan removeprefixdan removesuffix:

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

temukan posisi "pertama dan terakhir" dalam string Anda

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

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