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.

Solihull
sumber
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.

Ned Batchelder
sumber
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.
Ayman Hourieh
sumber
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

theannouncer
sumber
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)
Alex Martelli
sumber
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)
parikhparth23
sumber
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.

Eduardo Freitas
sumber
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"

Marcus
sumber
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
Rohail
sumber