2009-06-24 19 views
241

Aşağıdaki kodu var:Python'da bir dizenin sonundan bir alt dizeyi nasıl kaldırırım?

url = 'abcdc.com' 
print(url.strip('.com')) 

beklediğim: abcdc

I got:

abcd Şimdi

url.rsplit('.com', 1) 

daha iyi bir yolu var mı

do?

+33

Evet. str.strip, düşündüğün şeyi yapmaz. str.strip, dizenin başından ve sonundan itibaren belirtilen karakterlerden birini kaldırır. Yani, "acbacda" .strip ("ad") 'cbac' verir; Başlangıçta a ve sonunda da soyuldu. Şerefe. – scvalex

+2

__strip__, dizgenin her iki ucundan gelen karakterleri dizer, sizin durumunuzda ".", "C", "o" ve "m". – truppo

+1

Ayrıca, bu karakterleri dizenin önünden de kaldırır. Sonundan kaldırılmasını istiyorsanız, rstrip() –

cevap

357

Bunu yapabilirsiniz:

url = 'abcdc.com' 
if url.endswith('.com'): 
    url = url[:-4] 

Ya kullanarak düzenli ifadeler:

import re 
url = 'abcdc.com' 
url = re.sub('\.com$', '', url) 
+0

Beni daha iyi bir cevapla dövdün ... +1 –

+0

Hangisi daha iyi olurdu? re.sub ('\. Com $', '', url) url.rsplit ('. Com', 1) [0] Ya da her ikisini de, sorunu çözmek için farklı yollar .. – Ramya

+13

regex olmayan metot için –

9

ne dersiniz url[:-4]? Bunun bir uzantısı biliyorsanız

>>> import re 
>>> re.match(r"(.*)\.com", "hello.com").group(1) 
'hello' 
0

Bu normal ifadeler için mükemmel bir kullanımıdır.

+3

Ayrıca," .com "içinde * bitiş * ile eşleşen host'ları eşleştirdiğinizden emin olmak için bir $ eklemelisiniz. –

5

Bu abcdc.com veya www.abcdc.com veya abcdc.[anything] ile eşit derecede iyi çalışıyor ve daha genişletilebilir sonra

 
    url = 'abcdc.com' 
    ... 
    url.rsplit('.', 1)[0] # split at '.', starting from the right, maximum 1 split 

:

+3

Bunun için dikkatli olmanız gerekir, çünkü sağlanan url "www.abcdc.com" olarak değişirse, url.split ('.') [0] sadece "www" dir. – Neil

+0

Bu snippit'te herhangi bir hata denetimi yapma gereği duymadım, ama bu çok iyi bir nokta-- özellikle de aşırı uzlaşma konusundaki yorumumda. – JohnMetta

+9

Bu, url.rsplit ('.', 1) [0] 'ile düzeltilebilir. – EOL

-1

Rsplit ile yaptığınız şekilde yanlış bir şey göremiyorum, tam istediğiniz şeyi yapıyor. Her şey, çözümün ne kadar genel olmasını istediğinize bağlı. Her zaman .com kaldırmak ister misiniz, yoksa bazen .org olacak mı? Bu durumda, diğer çözümlerden birini kullanın, aksi halde, rsplit()

ile yapıştırın Strip() 'in beklediğiniz gibi çalışmadığı nedeni, her karakterin ayrı ayrı çalışmasıdır. Dizininizi tarayacak ve karakterlerin tüm oluşumlarını sondan ve önden çıkaracaktır. Yani diziniz 'c' ile başladıysa, bu da giderdi. Sadece arkadan soymak için rstrip kullanırsınız.

+0

'rsplit', OP'nin istediği şeyi tam olarak yapmaz. – winni2k

17

URL'niz hakkında ne bildiğinize ve tam olarak ne yapmaya çalıştığınıza bağlıdır. Eğer her zaman '.com' (veya '.net' veya '.org') 'de sona erecek biliyorsanız o zaman

url=url[:-4] 

hızlı çözümdür. Daha genel bir URL ise, o zaman muhtemelen python ile gelen urlparse kütüphanesine bakmak daha iyidir.

Eğer öte yandan siz sadece finalden sonra her şeyi kaldırmak istiyorsunuz. Bir dizgede

çalışacaktır. Ya da sadece herşeyi ilk önce görmek istiyorsanız.'Yerine' o zaman dize sadece sonunda görünen eminseniz, o zaman en basit yolu kullanmak olacaktır

url.split('.',1)[0] 
32
def strip_end(text, suffix): 
    if not text.endswith(suffix): 
     return text 
    return text[:len(text)-len(suffix)] 
+1

Sonekin boş olmadığını (eğer bir sabit olduğunda olduğu gibi) bilmiyorsanız, o zaman: return text [: - len (sonek)] – MarcH

+1

Teşekkürler. Son satır kısaltılabilir: 'dönüş metni [: - len (sonek)]' – Jabba

+1

@Jabba: Ne yazık ki, bu boş son ekler için işe yaramaz, zira fuenfundachtzig söz konusu. – yairchu

49

deneyin':

url = 'abcdc.com' 
print url.replace('.com','') 
+43

, aynı zamanda www.computerhope.com gibi url'nin yerini alacak. endswith() ile bir kontrol yapın ve iyi olmalı. – ghostdog74

+54

'" www.computerhope.com ".endswith (". Com ")' true, hala kırılacak! –

9

bir satırda:

text if not text.endswith(suffix) or len(suffix) == 0 else text[:-len(suffix)] 
0

Yoksa kullanabilirsiniz bölünmüş:

(Bu verilen örnekte tarafından konunun bir parçası gibi görünüyor gibi), tek böyle bir şey yapabileceği url'lerin
+4

"a =" www.computerbugs.com "olduğunda," www " – yairchu

+2

" rsplit "ile sonuçlanır. –

6

:

import os 
url = 'http://www.stackoverflow.com' 
name,ext = os.path.splitext(url) 
print (name, ext) 

#Or: 
ext = '.'+url.split('.')[-1] 
name = url[:-len(ext)] 
print (name, ext) 

Hem çıktısı: ('http://www.stackoverflow', '.com')

Bu aynı zamanda can ".com" ya da belirli bir şeyleri bölmeniz gerekiyorsa str.endswith(suffix) ile birleştirilebilir.

0
def remove_file_type(infile): 
import re 
return(re.sub('\.[^.]*$','',infile)) 
remove_file_type('abc.efg')'abc' 
+0

Sadece kodu yanıt olarak yazmayın. İlgili bir şeyi açıklayınız. Lütfen http://stackoverflow.com/help/how-to-answer –

+0

Merhaba 'u okuyun ve taşma yığınına hoş geldiniz. Orion'un belirttiği gibi - bu problemi çözebilir ... ama nasıl ve neden işe yaradığı hakkında biraz açıklama yapabilirseniz iyi olur :) Yığın taşmasıyla ilgili yeni yığınlar yığınları vardır ve bir şey öğrenebilirler veya uzmanlığınızdan iki kişi - sizin için bariz olan şey onlara karşı olmayabilir. –

26

kimse dışarı henüz bu konuda işaret ettiği gibi görünüyor beri: yeni liste nesne oluşturulduğu

url = "www.example.com" 
new_url = url[:url.rfind(".")] 

Bu split() kullanarak yöntemlerine göre daha verimli olmalı ve bu çözüm dizeleri çalışır birkaç nokta ile. Yaptığım bu yüzden Benim durumumda

+0

Vay bu güzel bir numara. Bunu başarısızlığa uğratamazdım, ama bunun başarısız olabileceği yolları düşünmek için de zor zamanlar geçirdim. Ben bunu seviyorum ama bu sadece "bakarak" ne olduğunu bilmek zor, çok "büyülü". Hattın her bir parçasını zihinsel olarak "onu elde etmek" için işlemek zorunda kaldım. – DevPlayer

+5

Bu, aranan dizgenin OLMADIĞINDA başarısız olur ve yanlış bir şekilde son karakteri kaldırır. – robbat2

0

bir istisna yükseltmek için gerekli:

class UnableToStripEnd(Exception): 
    """A Exception type to indicate that the suffix cannot be removed from the text.""" 

    @staticmethod 
    def get_exception(text, suffix): 
     return UnableToStripEnd("Could not find suffix ({0}) on text: {1}." 
           .format(suffix, text)) 


def strip_end(text, suffix): 
    """Removes the end of a string. Otherwise fails.""" 
    if not text.endswith(suffix): 
     raise UnableToStripEnd.get_exception(text, suffix) 
    return text[:len(text)-len(suffix)] 
1
import re 

def rm_suffix(url = 'abcdc.com', suffix='\.com'): 
    return(re.sub(suffix+'$', '', url)) 

bunu yapmak için en anlamlı yolu olarak bu cevabı tekrarlamak istiyorum. İşlemci Python yazma neden şişe boyun eğer Tabii ki, şu Ancak az CPU süresi

def rm_dotcom(url = 'abcdc.com'): 
    return(url[:-4] if url.endswith('.com') else url) 

alacaktı?

CPU ne zaman bir şişe boynudur? sürücülerde, belki.

Düzenli ifadeyi kullanmanın avantajları kod yeniden kullanılabilirliğidir. Daha sonra, sadece üç karakteri olan '.me' öğesini kaldırmak istiyorsan ne olur?

Aynı kod hile yapardı.

>>> rm_sub('abcdc.me','.me') 
'abcdc' 
0

url.rsplit ('com', 1)

çok doğru değil. Aslında yazmak gerekir ne

url.rsplit('.com', 1)[0] 

olduğunu ve oldukça özlü IMHO görünüyor.Yalnızca uzantıyı

url = 'abcdc.com' 
print('.'.join(url.split('.')[:-1])) 

Potansiyel diğer noktalarla herhangi bir uzatmaya çalışır şerit demek durumunda

url.rpartition('.com')[0] 
0

: sadece bir parametre kullandığından,

Ancak, benim kişisel tercihi bu seçenektir dosya adı da mevcut. Sadece noktalara listelemek için dize ayırır ve son eleman olmadan birleştirir.

Muhtemelen en hızlı değil, ama benim için diğer yöntemlerden daha okunabilir.

İlgili konular