Saya akan mengekstrak semua angka yang terkandung dalam string. Mana yang lebih cocok untuk tujuan, ekspresi reguler atau isdigit()
metode?
Contoh:
line = "hello 12 hi 89"
Hasil:
[12, 89]
Jika Anda hanya ingin mengekstrak hanya bilangan bulat positif, coba yang berikut ini:
>>> str = "h3110 23 cat 444.4 rabbit 11 2 dog"
>>> [int(s) for s in str.split() if s.isdigit()]
[23, 11, 2]
Saya berpendapat bahwa ini lebih baik daripada contoh regex karena tiga alasan. Pertama, Anda tidak perlu modul lain; kedua, ini lebih mudah dibaca karena Anda tidak perlu mengurai regex-bahasa mini; dan ketiga, lebih cepat (dan karenanya kemungkinan lebih pythonic):
python -m timeit -s "str = 'h3110 23 cat 444.4 rabbit 11 2 dog' * 1000" "[s for s in str.split() if s.isdigit()]"
100 loops, best of 3: 2.84 msec per loop
python -m timeit -s "import re" "str = 'h3110 23 cat 444.4 rabbit 11 2 dog' * 1000" "re.findall('\\b\\d+\\b', str)"
100 loops, best of 3: 5.66 msec per loop
Ini tidak akan mengenali float, bilangan bulat negatif, atau bilangan bulat dalam format heksadesimal. Jika Anda tidak dapat menerima batasan ini, jawaban ramping di bawah ini akan membantu.
re
. Ini adalah alat umum dan kuat (sehingga Anda belajar sesuatu yang sangat berguna). Kecepatan agak tidak relevan dalam parsing log (itu bukan pemecah angka intensif setelah semua),re
modul ini di perpustakaan Python standar dan tidak ada salahnya memuatnya.mumblejumble45mumblejumble
di mana saya tahu bahwa hanya ada satu nomor. Solusinya sederhanaint(filter(str.isdigit, your_string))
.str
yang kemudian menimpastr
objek dan metode dalam basis python. Itu bukan praktik yang baik karena Anda mungkin membutuhkannya nanti dalam skrip.int(filter(...))
akan meningkatkanTypeError: int() argument must be a string...
untuk Python 3.5, sehingga Anda dapat menggunakan versi terbaru:int(''.join(filter(str.isdigit, your_string)))
untuk mengekstraksi semua digit ke satu integer.Saya akan menggunakan regexp:
Ini juga akan cocok dengan 42 dari
bla42bla
. Jika Anda hanya ingin angka dibatasi oleh batas kata (spasi, titik, koma), Anda dapat menggunakan \ b:Untuk berakhir dengan daftar nomor alih-alih daftar string:
sumber
int
di atasnya dan Anda selesai. +1 terutama untuk bagian terakhir. Saya akan menyarankan string mentah (r'\b\d+\b' == '\\b\\d+\\b'
).int_list = [int(s) for s in re.findall('\\d+', 'hello 12 hi 89')]
map
.Ini lebih dari sedikit terlambat, tetapi Anda dapat memperluas ekspresi regex ke akun notasi ilmiah juga.
Semuanya baik-baik saja!
Selain itu, Anda dapat melihat regex bawaan AWS Glue
sumber
s = "4"
mengembalikan tidak cocok. Bisakah diedit juga untuk mengurus ini?[+-]?\d*[\.]?\d*(?:(?:[eE])[+-]?\d+)?
ini memang memberikan beberapa positif palsu (mis.+
Kadang-kadang ditangkap dengan sendirinya), tetapi mampu menangani lebih banyak bentuk, seperti.001
, plus itu tidak menggabungkan angka secara otomatis (seperti dalams=2+1
)[-+]?[.]?[\d]+(?:,\d\d\d)*[\.]?\d*(?:[eE][-+]?\d+)?
- konyol saya ... bagaimana mungkin saya tidak memikirkan itu?Saya berasumsi Anda ingin mengapung bukan hanya bilangan bulat, jadi saya akan melakukan sesuatu seperti ini:
Perhatikan bahwa beberapa solusi lain yang diposting di sini tidak bekerja dengan angka negatif:
sumber
float
keint
.re.findall("[-\d]+", "1 -2")
continue
alih-alihpass
di dalam loop?Jika Anda tahu itu hanya akan menjadi satu angka dalam string, yaitu 'halo 12 hai', Anda dapat mencoba memfilter.
Sebagai contoh:
Tapi hati-hati !!! :
sumber
TypeError: int() argument must be a string, a bytes-like object or a number, not 'filter'
- memperbaikinya dengan menggunakanint("".join(filter(str.isdigit, '200 grams')))
sumber
Saya sedang mencari solusi untuk menghilangkan topeng string, khususnya dari nomor telepon Brasil, posting ini tidak dijawab tetapi menginspirasi saya. Ini solusi saya:
sumber
Menggunakan Regex di bawah ini adalah caranya
dengan findall
re.findall(r'\d+', "hello 12 hi 89")
re.findall(r'\b\d+\b', "hello 12 hi 89 33F AC 777")
sumber
findall()
repl_str = re.compile('\d+.?\d*')
seharusnya:repl_str = re.compile('\d+\.?\d*')
Untuk contoh yang dapat direproduksi menggunakan python3.7re.search(re.compile(r'\d+.?\d*'), "42G").group()
'42G're.search(re.compile(r'\d+\.?\d*'), "42G").group()
'42'Hai,
Anda dapat mencari semua bilangan bulat dalam string melalui digit dengan menggunakan ekspresi findall.
Pada langkah kedua buat daftar res2 dan tambahkan angka yang ditemukan dalam string ke daftar ini
semoga ini membantu
Salam, Diwakar Sharma
sumber
Jawaban ini juga berisi huruf besar-kecil ketika angka tersebut mengambang dalam string
sumber
Saya kagum melihat bahwa belum ada yang menyebut penggunaan
itertools.groupby
sebagai alternatif untuk mencapai ini.Anda dapat menggunakan
itertools.groupby()
bersama denganstr.isdigit()
untuk mengekstraksi angka dari string sebagai:Nilai yang dipegang oleh
l
akan:PS: Ini hanya untuk tujuan ilustrasi untuk menunjukkan bahwa sebagai alternatif kita juga bisa menggunakan
groupby
untuk mencapainya. Tapi ini bukan solusi yang disarankan. Jika Anda ingin mencapai ini, Anda harus menggunakan jawaban fmark yang diterima berdasarkan menggunakan pemahaman daftar denganstr.isdigit
sebagai filter.sumber
Saya hanya menambahkan jawaban ini karena tidak ada yang menambahkan satu menggunakan penanganan Exception dan karena ini juga berfungsi untuk mengapung
Keluaran:
sumber
Untuk menangkap pola yang berbeda, sangat membantu untuk menanyakan dengan pola yang berbeda.
Atur semua pola yang menangkap berbagai pola minat:
(temukan koma) 12.300 atau 12.300,00
'[\ d] + [., \ d] +'
(temukan mengapung) 0.123 atau .123
'[\ d] * [.] [\ d] +'
(menemukan bilangan bulat) 123
'[\ d] +'
Gabungkan dengan pipa (|) menjadi satu pola dengan banyak atau kondisional .
(Catatan: Prioritaskan pola-pola kompleks terlebih dahulu. Pola-pola sederhana akan mengembalikan potongan tangkapan kompleks alih-alih tangkapan kompleks mengembalikan tangkapan penuh).
Di bawah ini, kami akan mengonfirmasi adanya pola
re.search()
, lalu mengembalikan daftar tangkapan yang dapat diubah. Akhirnya, kami akan mencetak setiap tangkapan menggunakan notasi braket untuk men-subseleksi nilai pengembalian objek yang cocok dari objek yang cocok.Pengembalian:
sumber
Karena tidak ada yang berurusan dengan angka keuangan dunia nyata dalam dokumen excel dan word yang perlu saya temukan, inilah variasi saya. Ia menangani int, float, angka negatif, angka mata uang (karena tidak membalas secara terpisah), dan memiliki opsi untuk menjatuhkan bagian desimal dan hanya mengembalikan int, atau mengembalikan semuanya.
Ini juga menangani sistem angka Indian Laks di mana koma muncul secara tidak teratur, tidak setiap 3 angka terpisah.
Itu tidak menangani notasi ilmiah atau angka negatif yang dimasukkan ke dalam tanda kurung dalam anggaran - akan tampak positif.
Itu juga tidak mengekstrak tanggal. Ada cara yang lebih baik untuk menemukan tanggal dalam string.
sumber
@ jmnas, saya menyukai jawaban Anda, tetapi tidak menemukan pelampung. Saya sedang mengerjakan skrip untuk mem-parsing kode menuju pabrik CNC dan perlu menemukan dimensi X dan Y yang bisa bilangan bulat atau mengapung, jadi saya menyesuaikan kode Anda dengan yang berikut. Ini menemukan int, mengapung dengan vals positif dan negatif. Masih tidak menemukan nilai hex berformat tetapi Anda dapat menambahkan "x" dan "A" melalui "F" ke
num_char
tuple dan saya pikir itu akan mengurai hal-hal seperti '0x23AC'.sumber
Pilihan terbaik yang saya temukan di bawah. Ini akan mengekstrak angka dan dapat menghilangkan semua jenis char.
sumber
Untuk nomor telepon, Anda cukup mengecualikan semua karakter non-digit dengan \ D di regex:
sumber