bagaimana saya bisa mendapatkan string setelah substring tertentu .
Misalnya saya ingin mendapatkan string setelah "dunia"
di my_string="hello python dunia , aku'm pemula "
Cara termudah adalah mungkin hanya untuk split pada target anda kata
my_string="hello python world , i'm a beginner "
print my_string.split("world",1)[1]
split mengambil kata(atau karakter) untuk membagi dan opsional batas jumlah dari perpecahan.
Dalam contoh ini dibagi pada "dunia" dan membatasi untuk hanya satu split.
s1 = "hello python world , i'm a beginner "
s2 = "world"
print s1[s1.index(s2) + len(s2):]
Jika anda ingin berurusan dengan kasus di mana s2
adalah tidak hadir di s1
, maka menggunakan s1.menemukan(s2)
sebagai lawan index
. Jika nilai kembali panggilan itu adalah -1
, kemudian s2
tidak s1
.
I'm heran tidak ada disebutkan partisi
.
def substring_after(s, delim):
return s.partition(delim)[2]
IMHO, ini solusi yang lebih mudah dibaca dari @arshajii's. Lain dari itu, saya pikir @arshajii's adalah yang terbaik untuk menjadi yang tercepat -- itu tidak menciptakan apapun yang tidak perlu salinan/substring.
Jika anda ingin melakukan ini dengan menggunakan regex, anda hanya bisa menggunakan non-menangkap kelompok, untuk mendapatkan kata "dunia" dan kemudian ambil semuanya setelah, suka jadi
(?:world).*
Contoh string yang diuji di sini
Anda ingin menggunakan str.partisi()
:
>>> my_string.partition("world")[2]
" , i'm a beginner "
karena pilihan ini lebih cepat daripada alternatif. Catatan bahwa ini menghasilkan string kosong jika pembatas yang hilang:
>>> my_string.partition("Monty")[2] # delimiter missing
''
Jika anda ingin memiliki string asli, kemudian menguji apakah kedua nilai kembali dari str.partisi()
adalah non-kosong:
prefix, success, result = my_string.partition(delimiter)
if not success: result = prefix
Anda juga bisa menggunakan str.split()
dengan batas 1:
>>> my_string.split("world", 1)[-1]
" , i'm a beginner "
>>> my_string.split("Monty", 1)[-1] # delimiter missing
"hello python world , i'm a beginner "
Namun, pilihan ini lambat. Untuk skenario kasus terbaik, str.partisi()
mudah tentang 15% lebih cepat dibandingkan dengan str.split()
:
tidak ada hilang pertama lower upper lalu str.partisi(...)[2]: [3.745 usec] [0.434 usec] [1.533 usec] <3.543 usec> [4.075 usec] str.partisi(...) dan tes: 3.793 usec 0.445 usec 1.597 usec 3.208 usec 4.170 usec str.split(..., 1)[-1]: <3.817 usec> <0.518 usec> <1.632 usec> [3.191 usec] <4.173 usec> % terbaik vs terburuk: 1.9% 16.2% 6.1% 9.9% 2.3%
Hal ini menunjukkan timing per eksekusi masukan-masukan di sini pembatas yang hilang (skenario terburuk), ditempatkan pertama (skenario kasus terbaik), atau di bagian bawah, bagian atas atau posisi terakhir. Waktu tercepat ditandai dengan [...]
dan <...>
tanda yang terburuk.
Tabel di atas dihasilkan oleh sebuah komprehensif time trial untuk semua tiga pilihan, diproduksi di bawah ini. Aku berlari tes pada Python 3.7.4 pada 2017 model 15" Macbook Pro dengan 2.9 GHz Intel Core i7 dan 16 GB ram.
Script ini menghasilkan kalimat acak dengan dan tanpa dipilih secara acak pembatas hadir, dan jika ada, pada posisi yang berbeda dalam menghasilkan kalimat, menjalankan tes secara acak dengan mengulangi (memproduksi tercantik hasil akuntansi untuk random OS peristiwa yang terjadi selama pengujian), dan kemudian mencetak tabel hasil:
``python
impor random
dari itertools produk impor
dari operator impor itemgetter
dari pathlib impor Jalan
dari waktuhal impor Timer
setup = "dari utama impor kalimat sebagai s, pembatas seperti d"
tes = {
"str.partisi(...)[2]": "r = s.partisi(d)[2]",
"str.partisi(...) dan uji": (
"awalan, sukses, hasilnya = s.partisi(d)\n"
"jika tidak sukses: hasil = awalan"
),
"str.split(..., 1)[-1]": "r = s.split(d, 1)[-1]",
}
penempatan = "hilang pertama lower upper terakhir".split()
delimiter_count = 3
wordfile = Path("/usr/dict/kata-kata") # Linux
jika tidak wordfile.ada():
wordfile = Path("/usr/share/dict/kata-kata") kata-kata = [w.strip() untuk w di wordfile.open()] def gen_sentence(pembatas, di mana="hilang", l=1000): """Menghasilkan acak kalimat panjang l Pembatas yang didirikan menurut nilai dimana: "hilang": tidak ada pembatas "lebih": pembatas adalah kata pertama "lebih": pembatas hadir di babak pertama "atas": pembatas hadir di babak kedua "terakhir": pembatas adalah kata terakhir """ mungkin = [w w dalam kata-kata jika pembatas tidak di w] kalimat = random.pilihan(mungkin, k=l) setengah = l // 2 jika mana == "lebih":
kalimat[0] = pembatas elif mana == "lebih":
kalimat[random.randrange(1 setengah)] = pembatas elif mana == "atas": kalimat[random.randrange(setengah, l)] = pembatas elif mana == "terakhir": kalimat[-1] = pembatas
kembali " ".bergabung(kalimat) pembatas = random.pilihan kata(kata-kata, k=delimiter_count) timing = {} kalimat = [
(w, d, gen_sentence(a, w)) d, w dalam produk(pembatas, penempatan) ] test_mix = [
(t, s) untuk t, s dalam produk(tes.item(), kalimat) ] acak.shuffle(test_mix) bagi saya, (label, uji, di mana, pembatas, kalimat) dalam menghitung(test_mix, 1): cetak(f"\rRunning tes waktunya, {i:2d}/{len(testmix)", end="") t = Timer(tes, setup) nomor, = t.autorange() hasil = t.ulangi(5, nomor)
timing.setdefault( label {} ).setdefault( di mana, [] ).append(min(dt / nomor dt di hasil)) print() skala = [(1.0, 'sec'), (0.001, 'msec'), (1e-06, 'usec'), (1e-09, 'nsec')] width = max(peta(len, timing)) baris = [] bestrow = dict.fromkeys(penempatan, (float("inf"), None)) worstrow = dict.fromkeys(penempatan, (float("-inf"), None)) untuk baris, label dalam menghitung(tes): kolom = [] terburuk = float("-inf") untuk p di penempatan: waktu = min(timing[label][p]) jika waktu < bestrow[p][0]: bestrow[p] = (waktu, baris) jika waktu > worstrow[p][0]: worstrow[p] = (waktu, baris) terburuk = max(waktu, terburuk) kolom.append(timing) skala, unit = next((s, u) untuk s, u di timbangan jika terburuk >= s) baris.append( [f"{label:>{width}}:", (f" {c / skala:.3f} {unit} " untuk c dalam kolom)] ) colwidth = max(len(c) untuk r dalam baris untuk c dalam r[1:]) cetak(' ' (lebar + 1), (p.pusat(colwidth) untuk p dalam penempatan), sep=" ") untuk r, turut dalam menghitung(baris): untuk c, p dalam menghitung(penempatan, 1): jika bestrow[p][1] == r: row[c] = f"[{row[c][1:-1]}]" elif worstrow[p][1] == r: row[c] = f"<{baris[c][1:-1]}>" print(baris, sep=" ") persentase = [] untuk p di penempatan: terbaik, terburuk = bestrow[p][0], worstrow[p][0] rasio = ((terburuk - terbaik) / buruk) persentase.append(f"{rasio:{colwidth - 1}.1% ") print("% terbaik vs terburuk:".rjust(width + 1), *persentase, sep=" ") ``
It's sebuah pertanyaan lama tapi aku menghadapi skenario yang sama, saya perlu membagi string menggunakan sebagai demiliter kata "murah" masalah bagi saya adalah bahwa saya memiliki dalam string yang sama kata-kata di bawah ini dan lebih rendah.
Saya dipecahkan menggunakan kembali modul cara ini
import re
string = '...below...as higher prices mean lower demand to be expected. Generally, a high reading is seen as negative (or bearish), while a low reading is seen as positive (or bullish) for the Korean Won.'
gunakan kembali.berpisah dengan regex untuk mencocokkan kata yang tepat
stringafterword = re.split('\\blow\\b',string)[-1]
print(stringafterword)
' reading is seen as positive (or bullish) for the Korean Won.'
generic kode:
re.split('\\bTHE_WORD_YOU_WANT\\b',string)[-1]
Semoga ini dapat membantu seseorang!
Anda dapat menggunakan paket ini disebut "substring". Cukup ketik "pip menginstal substring". Anda bisa mendapatkan substring dengan hanya menyebutkan awal dan akhir karakter/indeks.
Misalnya:
import substring
s = substring.substringByChar("abcdefghijklmnop", startChar="d", endChar="n")
print(s)
Output: