Saya mencari regex
pola yang akan cocok dengan ketiga, keempat, ... kemunculan setiap karakter. Lihat di bawah untuk klarifikasi:
Misalnya saya punya string berikut:
111aabbccxccybbzaa1
Saya ingin mengganti semua karakter yang digandakan setelah kejadian kedua. Outputnya adalah:
11-aabbccx--y--z---
Beberapa pola regex yang saya coba sejauh ini:
Dengan menggunakan regex berikut ini, saya dapat menemukan kemunculan terakhir dari setiap karakter: (.)(?=.*\1)
Atau menggunakan ini saya bisa melakukannya untuk duplikat berturut-turut tetapi tidak untuk duplikat: ([a-zA-Z1-9])\1{2,}
(.)(?<=^(?:(?:(?!\1).)*\1){2,}(?:(?!\1).)*\1)
regex. Demo .(.)(?<=(.*\1){3})
?(.)(?<=(?:.*\1){3})
akan melakukan pekerjaan itu juga, tetapi semua ini tidak bagus karena pengulangan yang berlebihan dapat menyebabkan masalah dengan string yang lebih panjang. Saya lebih suka menulis metode non-regex untuk menyelesaikan masalah.(.)(?<=(?:.*\1){3})
25ms,(.)(?<=(?:\1.*?){2}\1)
3ms. Anda bisa saja menguji diri sendiri. Pola Anda tampaknya paling tidak efisien dan paling sulit dibaca.Jawaban:
Solusi R non-regex. Split string. Ganti elemen dari vektor ini yang memiliki rowid> = 3 * with
'-'
. Rekatkan kembali.*
rowid(x)
adalah vektor integer dengan setiap elemen yang mewakili berapa kali nilai dari elemen terkaitx
telah direalisasikan. Jadi jika elemen terakhirx
adalah1
, dan itulah keempat kalinya1
terjadix
, elemen terakhirrowid(x)
adalah4
.sumber
Anda dapat dengan mudah mencapai ini tanpa regex:
Lihat kode yang digunakan di sini
Hasil:
Bagaimana ini bekerja:
for u in set(s)
mendapat daftar karakter unik dalam string:{'c','a','b','y','1','z','x'}
for i in ...
loop atas indeks yang kami kumpulkan 3.[i for i in range(len(s)) if s[i]==u][2:]
lilitkan setiap karakter dalam string dan periksa apakah cocoku
(dari langkah 1.), lalu iris array dari elemen ke-2 (menjatuhkan dua elemen pertama jika ada)s[:i]+'-'+s[i+1:]
- menggabungkan substring ke indeks dengan-
dan kemudian substring setelah indeks, secara efektif menghilangkan karakter asli.sumber
Opsi dengan
gsubfn
data
sumber
Tidak ada regex python one-liner:
Ini menghitung melalui string, menghitung kemunculan karakter saat ini di belakangnya dan hanya menempatkan karakter jika itu adalah salah satu dari 2 yang pertama, jika tidak lari.
sumber
Cara lain untuk melakukannya
pandas
.Keluaran :
sumber
Terima kasih kepada Wiktor Stribiżew , Stefan Pochmann , dan gelembung berbandul . Demi penyelesaian, saya memposting
regex
solusi yang mungkin dibahas dalam komentar;Ini hanya dapat dilakukan dengan regex yang mendukung tampilan lebar tak terbatas di belakang. Menggunakan modul Python PyPi regex kita bisa melakukan hal berikut:
Cuplikan .
sumber