Python 2.7.1 Saya mencoba menggunakan ekspresi reguler python untuk mengekstrak kata-kata di dalam pola
Saya memiliki beberapa string yang terlihat seperti ini
someline abc
someother line
name my_user_name is valid
some more lines
Saya ingin mengekstrak kata "my_user_name". Saya melakukan sesuatu seperti
import re
s = #that big string
p = re.compile("name .* is valid", re.flags)
p.match(s) #this gives me <_sre.SRE_Match object at 0x026B6838>
Bagaimana cara mengekstrak my_user_name sekarang?
group(0)
untuk pertandingan pertama?group(0)
mengembalikan teks yang cocok, bukan grup tangkapan pertama. Kode komentar benar, sementara Anda tampaknya membingungkan menangkap kelompok dan pertandingan.group(1)
mengembalikan grup tangkapan pertama.NameError: name '_' is not defined
_ = p.search(s)
. Saya melihatnya menyebutkan pengaturan hasil_
tetapi kode tidak mencerminkan itu. Saya berubah menjadi_ = p.search(s)
untuk baris kedua itu dan berhasil._
. Ini tidak berlaku di luar tempat lain.Anda dapat menggunakan grup yang cocok:
misalnya
Di sini saya menggunakan
re.findall
daripadare.search
mendapatkan semua contohmy_user_name
. Menggunakanre.search
, Anda perlu mendapatkan data dari grup pada objek yang cocok:Seperti yang disebutkan di komentar, Anda mungkin ingin membuat ekspresi reguler Anda tidak serakah:
untuk hanya mengambil hal-hal antara
'name '
dan berikutnya' is valid'
(daripada membiarkan ekspresi reguler Anda mengambil yang lain' is valid'
di grup Anda.sumber
(.*?)
? Ya, itu mungkin, meskipun tidak perlu kecuali OP kami menggunakanre.DOTALL
re.findall('name (.*) is valid', 'name jon clements is valid is valid is valid')
mungkin tidak akan memberikan hasil yang diinginkan ....group
persis sama dengan jawaban yang Anda terima ...Anda bisa menggunakan sesuatu seperti ini:
sumber
Mungkin itu sedikit lebih pendek dan lebih mudah dipahami:
sumber
Anda ingin grup tangkap .
sumber
Anda dapat menggunakan grup (ditunjukkan dengan
'('
dan')'
) untuk menangkap bagian dari string. Metode objek pencocokangroup()
kemudian memberi Anda konten grup:Di Python 3.6+ Anda juga dapat mengindeks objek yang cocok alih-alih menggunakan
group()
:sumber
Berikut cara melakukannya tanpa menggunakan grup (Python 3.6 atau lebih tinggi):
sumber
Anda juga dapat menggunakan grup penangkapan
(?P<user>pattern)
dan mengakses grup seperti kamusmatch['user']
.sumber
Sepertinya Anda benar-benar mencoba mengekstrak nama wakil hanya mencari kecocokan. Jika ini masalahnya, memiliki indeks span untuk kecocokan Anda sangat membantu dan saya merekomendasikan penggunaan
re.finditer
. Sebagai jalan pintas, Anda tahuname
bagian regex Anda adalah panjang 5 danis valid
panjangnya 9, sehingga Anda dapat memotong teks yang cocok untuk mengekstrak namanya.Catatan - Dalam contoh Anda, sepertinya
s
adalah string dengan jeda baris, jadi itulah yang diasumsikan di bawah ini.sumber