İlk ve son çift tırnak işaretlerini nasıl çıkarabilirim?


102

Şunlardan çift alıntı yapmak istiyorum:

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

elde etmek üzere:

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

Ben kullanmaya çalıştı rstrip, lstripvestrip('[^\"]|[\"$]') ama bir işe yoktu.

Bunu nasıl yapabilirim?


6
Doğru cevaplar aşağıda verilmiştir. Yaklaşımınıza gelince strip, lütfen a) bu yöntemin bağımsız değişken olarak bir normal ifadeyi almadığını, b) sağladığınız normal ifadenin zaten işe yaramayacağını ve c) bu yöntemin yalnızca bir değil, tüm bitişik karakterleri çıkaracağını unutmayın. ile iki çift tırnak kaybederdin .strip('"').
Tim Pietzcker

Yanıtlar:


189

Çıkarmak istediğiniz alıntılar her zaman söylediğiniz gibi "ilk ve son" olacaksa, şunu kullanabilirsiniz:

string = string[1:-1]


Aşağıdakiler daha güvenlidir!
R Claven

93

İşlediğiniz tüm dizelerin çift tırnak içerdiğini varsayamıyorsanız, aşağıdaki gibi bir şey kullanabilirsiniz:

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

Düzenle:

Eminim stringburada örnekleme için değişken adı olarak kullanmışsınızdır ve gerçek kodunuzda yararlı bir adı vardır, ancak stringstandart kütüphanelerde adında bir modül olduğu konusunda sizi uyarmak zorunda hissediyorum . Otomatik olarak yüklenmez, ancak kullanırsanız import stringdeğişkeninizin onu gölgede bırakmadığından emin olun.


1
Eğer dizge '"' ise (sadece bir çift tırnak), bu tek karakteri kaldıracaktır. Sanırım bu muhtemelen istenen şey değildir, muhtemelen Walapa sadece eşleşmişse çift alıntıyı kaldırmak istedi.
dbn

44

İlk ve son karakterleri kaldırmak için ve her durumda kaldırma işlemini yalnızca söz konusu karakter çift tırnak ise yapın:

import re

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

RE kalıbının vermiş olduğunuzdan farklı olduğuna ve işlemin sub("değiştir") boş bir değiştirme dizesi ( stripbir dize yöntemidir, ancak diğer yanıtların da belirttiği gibi gereksinimlerinizden oldukça farklı bir şey yapar) olduğuna dikkat edin.


4
Burada bir RE kullanmak IMHO'yu aşırır. Çözümü ile tercih ederim startsWith.
pihentagy

19
Pek çok Pythonista'nın RE'lere benzer tepkileri vardır ve bunlar gerçekten haksızdır - RE'ler oldukça hızlıdır. Ayrıca, yayınlandığı şekliyle "tercih ettiğiniz" çözüm, tamamen farklı bir şey yapar (yalnızca ilk ve son karakteri, her ikisi de çift tırnak ise kaldırır - ki bu, OP'nin özelliklerinden farklı görünür) - baştaki ve sondaki tırnaklar (varsa) bağımsız ayrılması gereklidir, bu çözüm bir 4 tablolar, 2-koşul blok haline gelir - şimdi o 's overkill aynı iş için tek bir hızlı ifadesi ile karşılaştırıldığında -!)
Alex Martelli

44

ÖNEMLİ: Soruyu / cevabı tek veya çift tırnak işaretlerini kaldıracak şekilde genişletiyorum. Ve ben soruyu, şeridi gerçekleştirmek için İKİ alıntıların da mevcut ve eşleşen olması gerektiği şeklinde yorumluyorum. Aksi takdirde, dize değiştirilmeden döndürülür.

Çevresinde tek veya çift tırnak bulunan bir dizgi temsilini "özümlemek" için (bu, @ tgray'ın cevabının bir uzantısıdır):

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

Açıklama:

startswithçeşitli alternatiflerden herhangi birini eşleştirmek için bir demet alabilir. Katlanmış parantez nedeni ((ve ))biz BİR parametre geçirmek öyle mi ("'", '"')üzere startswith(), önek yerine İKİ parametrelerini izin belirtmek için "'"ve '"'bir önek ve (geçersiz) başlangıç pozisyonu olarak yorumlanır.

s[-1] dizedeki son karakterdir.

Test yapmak:

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"

(Benim için normal ifade ifadelerinin okunması açık değil, bu yüzden @ Alex'in cevabını genişletmeye çalışmadım.)


1
İlk olarak ilk ve son karakterlerin aynı olup olmadığını kontrol ederseniz, o zaman yalnızca ilk karakterin bir alıntı olup olmadığını kontrol etmeniz gerekir: def strip_if_quoted (ad): if ad [0] == ad [-1] ve ad [0 ] içinde ("'",' "'): dönüş adı [1: -1]
TomOnTime

@TomOnTime: Haklısın, bu iyi bir optimizasyon. Ben uyguladım.
ToolmakerSteve

4
2 veya daha az karakter içeren dizeleri işlemenizi tavsiye ederim. Şu anda bu işlev 0 uzunluğundaki bir dizge için sınırların dışında bir istisna oluşturabilir. Ek olarak, 1 karakter uzunluğundaki bir dizeden bir alıntıyı kaldırabilirsiniz. Bir koruma len(s) >= 2veya benzeri bir şey ekleyebilirsiniz .
BrennanR

16

Dize her zaman gösterdiğiniz gibiyse:

string[1:-1]

9

Neredeyse bitti. Http://docs.python.org/library/stdtypes.html?highlight=strip#str.strip adresinden alıntı

Karakter argümanı, kaldırılacak karakter kümesini belirten bir dizedir.

[...]

Karakterler argümanı bir önek veya sonek değildir; bunun yerine, değerlerinin tüm kombinasyonları çıkarılır:

Dolayısıyla, argüman bir normal ifade değildir.

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

Bunun tam olarak istediğiniz şey olmadığını unutmayın, çünkü dizenin her iki ucundan birden fazla alıntı yiyor!


Amacıma mükemmel bir şekilde hizmet ediyor! Çok teşekkürler.
Sert Wardhan

4

Başında ve sonunda kaldırmak istediğiniz bir "olduğundan eminseniz, şunları yapmanız yeterlidir:

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

veya

string = string[1:-1]

2

Belirli bir dizeyi bir dizenin başından ve sonundan kaldırın.

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

> 'Hello World'

1

Tek veya çift tırnak işaretlerini kaldırması gereken bir kodum var ve bunu basitçe ast.literal_eval yapamam.

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

Bu ToolmakerSteve'in cevabına benzer, ancak 0 uzunlukta dizelere izin verir ve tek karakteri "boş bir dizeye dönüştürmez.


0

Örneğinizde şerit kullanabilirsiniz, ancak alan sağlamanız gerekir

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

çıktıdaki \ 'dizge çıktısı için standart python tırnak işareti

değişkeninizin değeri '\\ 1'


0

Aşağıdaki işlev boş boşlukları çıkaracak ve dizeleri tırnak işaretleri olmadan döndürecektir. Eğer tırnak işareti yoksa, aynı dizgeyi döndürür (soyulmuş)

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

dizenizdeki ilk ve son "un konumunu bulun

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

>>> s[l+1:r]
'" " " ""\\1" " "" "'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.