Python'da belirli bir karakterden sonra tüm karakterler nasıl kaldırılır?


148

Bir ipim var. Belirli bir karakterden sonra tüm metni nasıl silebilirim? ( Bu durumda... )
Sonraki metin ...değişecektir, bu yüzden belirli bir karakterden sonra tüm karakterleri kaldırmak istiyorum.


6
Bunun mantıklı olduğundan emin değilseniz, ne yapmak istediğinize ilişkin özel örnekler sunmak için sorunuzu güncelleyin.
S.Lott

Yanıtlar:


260

Ayırıcıya en fazla bir kez bölün ve ilk parçayı alın:

sep = '...'
rest = text.split(sep, 1)[0]

Ayırıcı yoksa ne olması gerektiğini söylemediniz. Bu ve Alex'in çözümü bu durumda tüm dizeyi döndürecektir.


İstek "ayırıcı sonra tüm metni kaldırmak" olduğunu, o metni "olsun" değil, bu yüzden [0] değil, [-1], aksi takdirde mükemmel bir çözüm istiyorum düşünüyorum.
Alex Martelli

Mükemmel çalıştım teşekkürler, Ayman & Alex'in de yaptığı gibi eminim, bu yüzden hepinize teşekkür ederim.
Solihull

5
Dizenin sonundan başlayarak bir karaktere bölmeniz gerekirse rsplit () kullanın.
Samuel

rsplit () aslında ayırıcının birden çok tekrarlanması durumunda soruyu cevaplar
Nate

94

Ayırıcısının '...' olduğunu varsayarsak, ancak herhangi bir dize olabilir.

text = 'some string... this part will be removed.'
head, sep, tail = text.partition('...')

>>> print head
some string

Ayırıcı bulunamazsa, headorijinal dizenin tümünü içerir.

Bölümleme işlevi Python 2.5'e eklendi.

bölüm (...) S. bölüm (sep) -> (kafa, sep, kuyruk)

Searches for the separator sep in S, and returns the part before it,
the separator itself, and the part after it.  If the separator is not
found, returns S and two empty strings.

Yine başka bir mükemmel çözüm - TOOOWTDI'yı ihlal ediyor muyuz? -) Belki kontrol etmek için bir zamana değer ...
Alex Martelli

9
.partition kazanır - döngü başına 0.756 usec, vs .split için 1.13 (yorum biçimlendirme gerçekten tam testleri göstermeme izin vermiyor, ancak @ Ayman'ın metnini ve ayırıcısını kullanıyorum) - yani @ Ayman'ın cevabı için +1 !
Alex Martelli

1
ve btw, tamlık için, RE-tabanlı çözüm 2,54 usec'tir, yani @ Ayman veya @ Ned'lerden çok daha yavaştır.
Alex Martelli

Eğer 2.5 ülkede iseniz bölüm kazanır :) Bizim için 2.4 sıkışmış emiciler, biz nispeten buzul bölünme yavaş yaşamak zorunda.
Gregg Lind

Örnek gerçekten yararlı.
Md. Sabbir Ahmed

18

Bir dize ayırıcı son oluşumundan sonra her şeyi kaldırmak istiyorsanız ben bu iyi çalışır buluyorum:

<separator>.join(string_to_split.split(<separator>)[:-1])

Örneğin string_to_split, bir yolsa root/location/child/too_far.exeve yalnızca klasör yolunu istiyorsanız, bölebilir "/".join(string_to_split.split("/")[:-1])ve root/location/child


1
Ayrıca, -1'i herhangi bir dizine, metni bıraktığınız oluşum olarak değiştirebilirsiniz.
öğretmen

10

RE olmadan (ki ne istediğinizi varsayalım):

def remafterellipsis(text):
  where_ellipsis = text.find('...')
  if where_ellipsis == -1:
    return text
  return text[:where_ellipsis + 3]

veya RE ile:

import re

def remwithre(text, there=re.compile(re.escape('...')+'.*')):
  return there.sub('', text)

Bir kwarg olarak sep = '...' kullanmak ve biraz daha geleceğe dönük hale getirmek için 3'ü kodlamak yerine len (sep) kullanmak isteyebilirsiniz.
cdleary

Evet, ancak her çağrıda RE'yi yeniden derlemeniz gerekir, bu nedenle performans RE çözümü için acı çeker (RE olmayan çözüm için gerçek bir fark yoktur). Bazı genellemeler ücretsiz, bazıları değil ... ;-)
Alex Martelli

@Alex - Çözümleri test ettiğiniz için teşekkürler!
Ayman Hourieh

2

Find yöntemi bir dizgideki karakter konumunu döndürür. Sonra, her şeyi karakterden kaldırmak istiyorsanız, bunu yapın:

mystring = "123⋯567"
mystring[ 0 : mystring.index("⋯")]

>> '123'

Karakteri korumak istiyorsanız, karakter konumuna 1 ekleyin.


1
import re
test = "This is a test...we should not be able to see this"
res = re.sub(r'\.\.\..*',"",test)
print(res)

Çıktı: "Bu bir testtir"


lütfen lütfen açıklayın
lone_coder

1

Bir dosyadan:

import re
sep = '...'

with open("requirements.txt") as file_in:
    lines = []
    for line in file_in:
        res = line.split(sep, 1)[0]
        print(res)

0

re'yi kullanmanın bir başka kolay yolu

import re, clr

text = 'some string... this part will be removed.'

text= re.search(r'(\A.*)\.\.\..+',url,re.DOTALL|re.IGNORECASE).group(1)

// text = some string
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.