Bagaimana cara menghapus semua karakter setelah karakter tertentu di python?


155

Saya memiliki tali. Bagaimana cara menghapus semua teks setelah karakter tertentu? ( Dalam hal ini... )
Teks setelahnya akan ...berubah jadi saya itu sebabnya saya ingin menghapus semua karakter setelah yang tertentu.


7
Jika Anda tidak yakin itu masuk akal, perbarui pertanyaan Anda untuk memberikan contoh spesifik tentang apa yang ingin Anda lakukan.
S. Lotot

Jawaban:


280

Pisahkan pemisah Anda paling banyak sekali, dan ambil bagian pertama:

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

Anda tidak mengatakan apa yang akan terjadi jika pemisah tidak ada. Baik ini dan solusi Alex akan mengembalikan seluruh string dalam kasus itu.


Permintaan adalah "hapus semua teks setelah" pemisah, bukan "dapatkan" teks itu, jadi saya pikir Anda menginginkan [0], bukan [-1], dalam solusi Anda yang sebaliknya sangat baik.
Alex Martelli

Bekerja dengan sempurna, terima kasih, karena saya yakin Ayman & Alex juga melakukannya, jadi terima kasih semua.
Solihull

7
Gunakan rsplit () jika Anda perlu memisahkan karakter yang dimulai dari akhir string.
Samuel

rsplit () sebenarnya menjawab pertanyaan jika ada beberapa kemunculan pemisah
Nate

100

Dengan asumsi pemisah Anda adalah '...', tetapi bisa berupa string apa pun.

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

>>> print head
some string

Jika pemisah tidak ditemukan, headakan berisi semua string asli.

Fungsi partisi ditambahkan dengan Python 2.5.

partisi (...) S. partisi (sep) -> (kepala, sep, ekor)

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.

Namun solusi bagus lainnya - apakah kita melanggar TOOOWTDI? -) Mungkin layak untuk dicek ...
Alex Martelli

9
.partition menang - 0,756 usec per loop, vs 1,13 untuk .split (format komentar tidak benar-benar memungkinkan saya menunjukkan tes yang tepat, tetapi saya menggunakan teks dan pemisah @ Ayman) - jadi, +1 untuk jawaban @ Ayman !
Alex Martelli

1
dan btw, untuk kelengkapan, solusi berbasis RE adalah 2.54 usec, yaitu, jauh lebih lambat daripada @ Ayman atau @ Ned.
Alex Martelli

partisi menang jika Anda berada di 2.5 daratan :) Bagi kami pengisap terjebak di 2.4, kita harus hidup dengan kelambatan relatif glasial perpecahan.
Gregg Lind

Contoh sangat membantu.
Md. Sabbir Ahmed

18

Jika Anda ingin menghapus semuanya setelah pemisah terakhir dalam sebuah string, saya menemukan ini berfungsi dengan baik:

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

Misalnya, jika string_to_splitadalah jalur seperti root/location/child/too_far.exedan Anda hanya menginginkan jalur folder, Anda dapat membaginya "/".join(string_to_split.split("/")[:-1])dan Anda akan mendapatkannya root/location/child


1
Selain itu, Anda dapat mengubah -1 itu ke indeks mana pun menjadi kejadian di mana Anda menjatuhkan teks.
theannouncer

10

Tanpa RE (yang saya asumsikan adalah yang Anda inginkan):

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

atau, dengan RE:

import re

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

Mungkin ingin menggunakan sep = '...' sebagai kwarg dan menggunakan len (sep) daripada hard-coding 3 untuk membuatnya sedikit lebih tahan masa depan.
cdleary

Ya, tetapi kemudian Anda perlu mengkompilasi ulang RE pada setiap panggilan, sehingga performa solusi RE akan terganggu (tidak ada perbedaan nyata untuk solusi non-RE). Beberapa generalisasi gratis, beberapa tidak ... ;-)
Alex Martelli

@Alex - Terima kasih telah menguji solusinya!
Ayman Hourieh

2

Dari file:

import re
sep = '...'

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

2

Metode find akan mengembalikan posisi karakter dalam string. Kemudian, jika Anda ingin menghapus semua hal dari karakter tersebut, lakukan ini:

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

>> '123'

Jika Anda ingin mempertahankan karakter tersebut, tambahkan 1 ke posisi karakter.


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

Keluaran: "Ini adalah ujian"


mohon jelaskan
lone_coder

0

cara mudah lain menggunakan re akan

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.