Saya belajar Python Regular Expression (kembali) untuk menganalisis teks Twitter.

Katakanlah saya memiliki teks twitter seperti di bawah ini dan saya hanya ingin mengekstrak persis '3/10' dari txt.
Python mengembalikan daftar kosong [] dalam kasus ini.

txt = "my mood is low 3/10. 05/01/2021 Tuesday"
re.findall('^\d+\/\d{2}$', txt)

Apa yang salah dengan kode saya?

1
Ong K.S 5 Januari 2021, 11:16

3 jawaban

Jawaban Terbaik

Alih-alih menggunakan jangkar untuk mencocokkan seluruh baris, Anda dapat menggunakan pencarian negatif untuk menegaskan batas spasi putih ke kiri, dan bukan / ke kanan untuk mencocokkan 3/10 saja.

(?<!\S)\d+\/\d{2}(?!/)

Demo ekspresi reguler

import re
txt = "my mood is low 3/10. 05/01/2021 Tuesday"
print(re.findall('(?<!\S)\d+\/\d{2}(?!/)', txt))

Keluaran

['3/10']
2
The fourth bird 5 Januari 2021, 08:34

Menurut re docs

^ (Caret.) Cocok dengan awal string, dan dalam mode MULTILINE juga cocok segera setelah setiap baris baru.

$ Cocok dengan akhir string atau tepat sebelum baris baru di akhir string, dan dalam mode MULTILINE juga cocok sebelum baris baru. foo cocok dengan 'foo' dan 'foobar', sedangkan ekspresi reguler foo$ hanya cocok dengan 'foo'. Lebih menarik lagi, mencari foo.$ di 'foo1\nfoo2\n' cocok dengan 'foo2' secara normal, tetapi 'foo1' dalam mode MULTILINE; mencari satu $ di 'foo\n' akan menemukan dua kecocokan (kosong): satu tepat sebelum baris baru, dan satu lagi di akhir string.

Ini tidak terjadi dalam contoh Anda. Anda perlu menggunakan pernyataan panjang-nol yang lebih maju.

0
Daweo 5 Januari 2021, 08:26

Hapus ^ dan $

re.findall(r'\b\d+/\d{2}\b', txt)
0
Alec 5 Januari 2021, 08:21