Bagaimana cara menghapus karakter non-alfa awal dan akhir dalam string yang diberikan, sebelum dan sesudah substring tertentu? Lihat contoh di bawah ini

input_string = m#12$my#tr!#$g%

output_string = m12my#tr!g

Substring, dalam hal ini, adalah my#tr!

Bagaimana bisa mendapatkan output_string yang diberikan input_string?

Upaya saya di bawah ini menghapus semua karakter utama (termasuk alfanumerik). Lihat cuplikan kode di bawah). Saya mencoba mengubah \W+ alih-alih .+ yang tidak berhasil.

import re
input_string = "m#12$my#tr#$%"
output_string = re.sub(r'.+?(?=my#tr!)', '', "m#12$my#tr!#$g%")

Hargai pemikiran apa pun tentang bagaimana saya bisa menggunakan pola regex untuk tujuan ini.

0
Mad 12 Mei 2021, 05:02

1 menjawab

Jawaban Terbaik

Salah satu cara untuk melakukannya adalah dengan membagi string di sekitar substring yang diinginkan, ganti karakter non-alfanumerik di bagian pertama dan terakhir, lalu pasang kembali string:

import re

input_string = "m#12$my#tr!#$g%"
mid = 'my#tr!'
first, last = input_string.split(mid)
first = re.sub('[^a-z0-9]', '', first)
last = re.sub('[^a-z0-9]', '', last)

output_string = first + mid + last
print(output_string)

Keluaran:

m12my#tr!g

Jika Anda menggunakan modul regex dari PyPi, Anda dapat memanfaatkan tampilan panjang variabel di belakang dan ganti karakter non-alfanumerik yang ada sebelum atau sesudah string target:

import regex

input_string = "m#12$my#tr!#$g%"
mid = 'my#tr!'
output_string = regex.sub(rf'[^a-z0-9](?=.*{mid})|(?<={mid}.*)[^a-z0-9]', '', input_string)
# 'm12my#tr!g'

Perhatikan bahwa jika mid berisi karakter yang khusus untuk regex (mis. . [ { $ ^ dll), Anda harus menghindarinya sebelum menggunakan mis.

mid = 'my#tr!'
mid = regex.escape(mid)

Jika Anda tidak ingin menggunakan regex sama sekali, Anda dapat menghapus karakter non-alfanumerik secara manual dari bagian pertama dan terakhir. Sebagai contoh:

import string

input_string = "m#12$my#tr!#$g%"
mid = 'my#tr!'
first, last = input_string.split(mid)
first = ''.join(c for c in first if c in string.ascii_letters + string.digits)
last = ''.join(c for c in last if c in string.ascii_letters + string.digits)
output_string = first + mid + last
1
Nick 12 Mei 2021, 02:59