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


Benim bir ipim var. Belirli bir karakterden sonra tüm metni nasıl kaldırırım? (Bu durumda ...)
Sonra metin ... Bu yüzden, bu yüzden tüm karakterleri kesin bir şekilde kaldırmak istiyorum.


76
2018-05-24 21:56


Menşei


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


Cevaplar:


En çok bir kez ayırıcınıza bölün ve ilk parçayı al.

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

Ayırıcı mevcut değilse ne olacağını söylemediniz. Hem bu hem de Alex'in çözümü bu durumda bütün ipi geri getirecek.


138
2018-05-24 22:01



İstek "ayırıcıdan sonra tüm metni kaldırır", bu metni "almaz", aksi takdirde mükemmel çözümünüzde [1] değil [1] olmasını istersiniz. - Alex Martelli
Mükemmel bir şekilde çalıştım, eminim Ayman & Alex'in de yaptığı gibi, hepinize teşekkür ederim. - Solihull
Dizenin sonundan başlayarak bir karaktere bölmeniz gerekiyorsa rsplit () öğesini kullanın. - Samuel
rsplit () aslında ayırıcının birden fazla oluşu varsa soruyu yanıtlar. - Nate


Ayırıcınızın '...' olduğunu varsayarsak, 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, head tüm orijinal dizeyi içerecektir.

Bölüm fonksiyonu Python 2.5'e eklenmiştir.

bölme (...)       S.partition (sep) -> (baş, 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.

59
2018-05-24 22:02



Yine de başka bir mükemmel çözüm - TOOOWTDI'yi ihlal ediyor muyuz? -) Belki de kontrol etmek için ... - Alex Martelli
.partition kazanır - loop başına 0.756 usec, vs .13 için yorumlama (yorum biçimlendirme, gerçekten kesin testleri göstermeme izin vermiyor, ama @ Ayman'ın metnini ve ayırıcısını kullanıyorum) - @ Ayman'ın cevabı için +1 ! - Alex Martelli
ve btw, tamlık için, RE-tabanlı çözüm 2.54 usec'tir, yani, @ Ayman'ın ya da @ Ned'inden daha yavaştır. - Alex Martelli
2.5 karadaysanız, bölüm kazanır :) Bizim için 2,4'te sıkışmış olan suckers, bölünmenin nispeten buzul yavaşlığı ile yaşamak zorundayız. - Gregg Lind


RE olmadan (hangisini istediğinizi varsayalım):

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

veya bir RE ile:

import re

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

7
2018-05-24 22:00



Bir kwarg olarak sep = '...' kullanmak isteyebilir ve 3'ü daha geleceğe dayanıklı hale getirmek için 3'ü kodlamak yerine len (sep) kullanın. - cdleary
Evet, ancak daha sonra her bir çağrı için RE'yi yeniden derlemeniz gerekir, bu nedenle performans RE çözümüne zarar verir (RE olmayan çözüm için gerçek bir fark yoktur). Bazı genellik ücretsizdir, bazıları değil ... ;-) - Alex Martelli
@Alex - Çözümleri test ettiğiniz için teşekkür ederiz! - Ayman Hourieh


Bir dizede sonuncu ayırıcının ardından her şeyi kaldırmak isterseniz, bunun iyi çalıştığını görüyorum:

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

Örneğin, string_to_split gibi bir yol root/location/child/too_far.exe ve sadece klasör yolunu istiyorsunuz, "/".join(string_to_split.split("/")[:-1]) ve alacaksın root/location/child


7
2017-09-14 22:18



ek olarak, -1'i herhangi bir dizine, metni bıraktığınız oluşum olacak şekilde değiştirebilirsiniz. - theannouncer


yeniden kullanarak başka bir kolay yolu olacak

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

0
2018-05-20 10:42