Katakanlah saya memiliki string 'gfgfdAAA1234ZZZuijjk'
dan saya ingin mengekstrak '1234'
bagiannya saja.
Saya hanya tahu apa yang akan menjadi beberapa karakter secara langsung sebelumnya AAA
, dan setelah ZZZ
bagian saya tertarik 1234
.
Dengan sed
dimungkinkan untuk melakukan sesuatu seperti ini dengan string:
echo "$STRING" | sed -e "s|.*AAA\(.*\)ZZZ.*|\1|"
Dan ini akan memberi saya 1234
hasilnya.
Bagaimana melakukan hal yang sama dengan Python?
Kemudian Anda dapat menggunakan regexps dengan modul re juga, jika Anda mau, tetapi itu tidak perlu dalam kasus Anda.
sumber
re
metode ini tidak lebih cepat?s
,s.find
akan kembali-1
. operator pengiriss[begin:end]
akan menerimanya sebagai indeks yang valid, dan mengembalikan substring yang tidak diinginkan.ekspresi reguler
As-is di atas akan gagal dengan
AttributeError
jika tidak ada "AAA" dan "ZZZ" diyour_text
metode string
Di atas akan mengembalikan string kosong jika "AAA" atau "ZZZ" tidak ada di
your_text
.Tantangan PS Python?
sumber
sumber
AttributeError: 'NoneType' object has no attribute 'groups'
- jika tidak ada AAA, ZZZ dalam string ...Terkejut bahwa tidak ada yang menyebutkan ini yang merupakan versi cepat saya untuk skrip satu kali:
sumber
Anda dapat melakukannya hanya dengan menggunakan satu baris kode
hasilnya akan menerima daftar ...
sumber
Anda dapat menggunakan modul re untuk itu:
sumber
echo "$STRING" | sed -e "s|.*AAA\(.*\)ZZZ.*|\1|"
Anda bisa melakukan hal yang sama dengan
re.sub
fungsi menggunakan regex yang sama.Dalam sed dasar, grup menangkap diwakili oleh
\(..\)
, tetapi dalam python diwakili oleh(..)
.sumber
Dalam python, mengekstraksi string bentuk substring dapat dilakukan dengan menggunakan
findall
metode dalam regular expression (re
) module.sumber
sumber
sumber
Memberi
sumber
Kalau-kalau ada yang harus melakukan hal yang sama yang saya lakukan. Saya harus mengekstrak semua yang ada di dalam tanda kurung. Misalnya, jika saya memiliki garis seperti 'Presiden AS (Barack Obama) bertemu dengan ...' dan saya hanya ingin mendapatkan 'Barack Obama' ini adalah solusi:
Yaitu Anda perlu memblokir tanda kurung dengan
slash \
tanda. Padahal itu adalah masalah tentang ekspresi yang lebih teratur dari Python.Juga, dalam beberapa kasus, Anda mungkin melihat simbol 'r' sebelum definisi regex. Jika tidak ada awalan r, Anda perlu menggunakan karakter escape seperti di C. Ini adalah diskusi lebih lanjut tentang itu.
sumber
Menggunakan PyParsing
yang menghasilkan:
[['1234']]
sumber
Berikut adalah solusi tanpa regex yang juga memperhitungkan skenario di mana substring pertama berisi substring kedua. Fungsi ini hanya akan menemukan substring jika penanda kedua adalah setelah penanda pertama.
sumber
Cara lain untuk melakukannya adalah menggunakan daftar (seandainya substring yang Anda cari terbuat dari angka saja):
sumber
Satu liner yang mengembalikan string lain jika tidak ada kecocokan. Sunting: versi yang ditingkatkan menggunakan
next
fungsi, ganti"not-found"
dengan yang lain jika diperlukan:Metode saya yang lain untuk melakukan ini, kurang optimal, menggunakan regex 2nd time, masih belum menemukan cara yang lebih pendek:
sumber