Periksa Jika String Berisi Angka dengan Python

Pengantar

Baik Anda membuat skrip verifikasi untuk input pengguna, formulir login yang meminta pengguna untuk menyertakan karakter dalam kata sandi โ€“ memeriksa apakah string berisi karakter bukanlah operasi yang tidak biasa.

Dalam tutorial ini โ€“ kita akan melihat banyak cara untuk memeriksa apakah suatu string berisi digit/angka dengan Python, termasuk tolok ukur untuk pendekatan yang paling efisien pada akhirnya.

Periksa Apakah String Berisi Angka dengan Python

Ada beberapa cara untuk memeriksa apakah a karakter adalah angka (ord(), isnumeric(), isdigit()), yang dapat Anda pasangkan dengan for-loop, untuk memeriksa setidaknya satu pukulan positif. Alternatifnya, Anda dapat menggunakan Ekspresi Reguler sebagai pencocokan pola umum, yang fleksibel, kuat, dan dirancang untuk diterapkan pada kumpulan teks yang besar. Akhirnya โ€“ Anda selalu bisa map() setiap karakter diberi pernyataan bersyarat, dan kembali True is any() diantaranya menghasilkan True.

Memilih di antara keduanya harus mempertimbangkan efisiensi metode, verbositas dan gaya pengkodean, serta tugas hulu atau hilir yang terkait dengan operasi.

Periksa apakah String Berisi Nomor dengan ord()

Grafik ord() fungsi mengambil karakter dan mengembalikannya ASCII nilai:

print(ord('0')) 
print(ord('9')) 

Nilai ASCII dari 0 adalah 48, dan nilai ASCII dari 9 adalah 57. Angka apa pun di antara angka-angka ini, selanjutnya akan menjadi, memiliki nilai ASCII antara 48 dan 57. Sekarang untuk memeriksa apakah string memiliki nomor, kita akan melintasi seluruh string input dan memeriksa nilai ASCII setiap karakter, jika nilai ASCII lebih dari 47 dan kurang dari 58, berarti itu adalah angka, dan kami akan mengembalikannya True:

input_string = "My name is Satyam & I am 22 yrs old"
flag = False
for ch in input_string:
    ascii_code = ord(ch)
    if 47 < ascii_code < 58:
        flag = True
        break
if flag:
    print("Yes, the string contains a number.")
else:
    print("No, the string does not contain a number.")

Ini menghasilkan:

Yes, the string contains a number.

Periksa apakah String Berisi Angka dengan isnumerik()

Grafik isnumeric() mengembalikan fungsi True jika string masukan hanya berisi angka, jika tidak, ia akan kembali False:

str1 = "918"
print("String is whole numeric?", str1.isnumeric())
str2 = "The meaning of the universe is 42"
print("String is whole numeric?", str2.isnumeric())

Ini menghasilkan:

String is whole numeric? True 
String is whole numeric? False

Catatan: Grafik isnumeric() fungsi tidak akan berperilaku seperti yang Anda harapkan bilangan negatif atau mengambang. Jika kita meneruskan string yang hanya berisi angka negatif atau float, string tersebut akan kembali False, Karena - dan . karakter yang diasosiasikan dengan angka negatif dan float memang bukan angka.

str1 = "-918"
print("String is whole numeric?", str1.isnumeric()) 

str2 = "91.8"
print("String is whole numeric?", str2.isnumeric()) 

Padahal, karena karakter hanyalah string dengan panjang 1 dengan Python โ€“ Anda dapat mengulangi karakter dan menggunakannya isnumeric() untuk memeriksa apakah itu nomor:

input_string = "My name is Satyam & I am 22 yrs old"
flag = False
for ch in input_string:
    if ch.isnumeric():
        flag = True
        break
if flag:
    print("Yes, the string contains a number.")
else:
    print("No, the string does not contain a number.")

Periksa apakah String Berisi Nomor dengan isdigit()

Grafik isdigit() fungsi memeriksa apakah semua karakter dalam string adalah angka. Jika ya โ€“ ia kembali True, dan jika tidak, ia kembali False. Sekali lagi, karena karakter hanyalah string dengan panjang 1 di Python โ€“ metode ini dapat digunakan dalam satu loop untuk setiap karakter:

input_string = "My name is Satyam & I am 22 yrs old"
flag = False
for ch in input_string:
    if ch.isdigit():
        flag = True
        break
if flag:
    print("Yes, the string contains a number.")
else:
    print("No, the string does not contain a number.")

Catatan: Grafik isdigit() metode hanya berperilaku dengan cara yang sama seperti isnumeric(), dan jika Anda meneruskan string yang berisi float atau angka negatif ke dalamnya, False dikembalikan karena karakter khusus bukan angka. Namun, pada tingkat karakter, selama itu True nilai cukup untuk menentukan apakah string berisi angka โ€“ ini dapat diterapkan.

Perbedaan Antara isnumerik() dan isdigit()?

Jadi, apa perbedaannya isnumeric() dan isdigit()? Selagi kita melakukannya โ€“ bagaimana dengan isdecimal()?

  • isnumeric() memeriksa apakah ada karakter yang a representasi unicode dari nilai angka (yang mencakup representasi numerik romawi, superskrip, subskrip, dan pecahan)
  • isdigit() memeriksa apakah ada karakter yang a angka unicode (yang tidak menyertakan representasi numerik romawi, tetapi menyertakan super/subskrip dan pecahan)
  • isdecimal() memeriksa apakah ada karakter yang a angka desimal (yang akan kembali False untuk apa pun yang tidak 0..9 di basis 10)

isnumeric() adalah metode yang paling luas, sementara isdecimal() adalah yang paling sempit di antara ketiganya.

Periksa apakah String Berisi Nomor dengan map() dan any()

Grafik map() fungsi mengeksekusi fungsi yang disediakan untuk setiap elemen iterable yang diteruskan dalam fungsi peta. Setiap elemen dari sebuah iterable diteruskan ke fungsi sebagai parameter:

map(function, iterable)

Grafik function dieksekusi untuk setiap item dari iterable. Hal ini memungkinkan logika yang sangat fleksibel dan kuat, hanya dibatasi oleh keluasan logika function Anda memanggil masukan! Metode ini mengembalikan a map misalnya, yang dapat dengan mudah diubah menjadi koleksi lain seperti daftar atau kumpulan.

Kita dapat menulis fungsi yang mengembalikan boolean yang mewakili apakah suatu karakter berupa angka, dan map() panggilan dengan demikian akan menghasilkan daftar nilai boolean.

Grafik any() Pengembalian True jika ada elemen dari iterable yang diteruskan True, jika tidak, ia akan kembali False.

Merangkai keduanya โ€“ kita dapat membuat skrip pendek tingkat tinggi dan mengabstraksi perulangan for:

def func(ch):
    return ch.isdigit() 

input_string = "My name is Satyam & I am 22 yrs old"
contains_number = any(list(map(func, input_string)))
print("Is there a number present?", contains_number)

Ini menghasilkan:

Is there a number present? True

Jika fungsi Anda adalah satu baris โ€“ tidak perlu mengekstraknya sebagai fungsi bernama. Anda dapat menulis secara anonim fungsi lambda sebagai gantinya demi singkatnya:

Lihat panduan praktis dan praktis kami untuk mempelajari Git, dengan praktik terbaik, standar yang diterima industri, dan termasuk lembar contekan. Hentikan perintah Googling Git dan sebenarnya belajar itu!

input_string = "My name is Satyam & I am 22 yrs old"
contains_number = any(list(map(lambda ch: ch.isdigit(), input_string)))
print("Is there any number present?", contains_number)

Ini juga menghasilkan:

Is there any number present? True

Periksa apakah String Berisi Angka dengan Python dengan Ekspresi Reguler

Ekspresi Reguler adalah pola pencarian dirancang untuk dicocokkan dengan teks masukan. Mereka fleksibel dan sesuai dengan sifatnya โ€“ Anda dapat menulis sejumlah ekspresi untuk mencari pola yang sama, serta mencakup pola apa pun yang dapat Anda pikirkan.

Python re modul digunakan untuk menulis, mengkompilasi dan mencocokkan teks dengan ekspresi reguler. Ini memaparkan berbagai metode, seperti match() yang cocok dengan apakah suatu string dimulai dengan suatu pola, search() yang menemukan kemunculan pertama dari kemungkinan banyak kecocokan dalam sebuah string, dan findall() yang memeriksa semua kejadian.

Catatan: Ketiga metode menerima a pattern dan search argumen dan jalankan pencarian untuk pattern dalam search String.

Pola yang mengidentifikasi a angka is "d+":

import re
input_string = "My name is Satyam & I am 22 yrs old"
match = re.search(r"d+", input_string)
if match:
    print("Is there any number present?", "Yes")
else:
    print("Is there any number present?", "No")

Grafik search() metode mengembalikan a re.Match objek, berisi kecocokan yang ditemukan serta indeks awal dan akhir:


Objeknya dapat dievaluasi ke nilai boolean berdasarkan apakah itu a re.Match objek atau None. Hal ini mengakibatkan:

Is there any number present? Yes

Berbeda dengan search() metode, findall() Metode mengembalikan semua kemunculan pola, bukan hanya yang pertama:

import re
input_string = "My name is Satyam & I am 22 yrs old"
match = re.findall(r"d+", input_string)
if match:
    print("Is there any number present?", "Yes")
else:
    print("Is there any number present?", "No")

Ini menghasilkan:

Is there any number present? Yes

benchmarking

Bagaimana dengan performanya? Jika Anda mengekstrak logika dan memangkas bagian-bagian yang tidak perlu, membatasi metode untuk mengembalikan hasilnya saja, Anda dapat dengan mudah membandingkannya satu sama lain pada masukan yang sama:

%timeit ord_check()
%timeit isnumeric_check()
%timeit is_digit_check()
%timeit lambda_check()
%timeit regex_check()

Ini menghasilkan:

2.18 ยตs ยฑ 51.5 ns per loop (mean ยฑ std. dev. of 7 runs, 100,000 loops each)
2.04 ยตs ยฑ 639 ns per loop (mean ยฑ std. dev. of 7 runs, 1,000,000 loops each)
1.88 ยตs ยฑ 448 ns per loop (mean ยฑ std. dev. of 7 runs, 1,000,000 loops each)
5.07 ยตs ยฑ 915 ns per loop (mean ยฑ std. dev. of 7 runs, 100,000 loops each)
1.47 ยตs ยฑ 3.41 ns per loop (mean ยฑ std. dev. of 7 runs, 1,000,000 loops each)

Umumnya pendekatan for-loop dijalankan pada waktu yang hampir bersamaan, dengan sedikit overhead dari metode spesifik. Lambda dengan any() secara defacto adalah yang paling lambat (banyak operasi yang berlebihan, karena mengubah daftar menjadi daftar dan kemudian menguranginya), sedangkan Ekspresi Reguler memiliki waktu proses tercepat dengan varian terendah di sekitarnya (cepat secara konsisten).

Namun, pada teks masukan yang lebih panjang, kompleksitas waktu pada masing-masing pendekatan berbeda akan ditekankan, terutama bergantung pada jumlah digit yang cocok (apakah digit tersebut umum atau tidak):

import random
import string

input_string_random = ''.join(random.choices(string.ascii_uppercase + string.digits, k=1000))
print(input_string_random) 

input_string_with_single_digit = ''.join(random.choices(string.ascii_uppercase, k=1000)) + '1'
print(input_string_with_single_digit) 

String pertama menghasilkan urutan acak dengan jumlah digit dan karakter yang kira-kira sama, sedangkan string kedua adalah string hanya karakter dengan satu digit di akhir (kompleksitas waktu terburuk):

%timeit ord_check(input_string_random)
504 ns ยฑ 22.6 ns per loop (mean ยฑ std. dev. of 7 runs, 1,000,000 loops each)
%timeit ord_check(input_string_with_single_digit)
76.2 ยตs ยฑ 1.36 ยตs per loop (mean ยฑ std. dev. of 7 runs, 10,000 loops each)
%timeit isnumeric_check(input_string_random)
756 ns ยฑ 170 ns per loop (mean ยฑ std. dev. of 7 runs, 1,000,000 loops each)
%timeit isnumeric_check(input_string_with_single_digit)
76.2 ยตs ยฑ 8.43 ยตs per loop (mean ยฑ std. dev. of 7 runs, 10,000 loops each)
%timeit is_digit_check(input_string_random)
549 ns ยฑ 102 ns per loop (mean ยฑ std. dev. of 7 runs, 1,000,000 loops each)
%timeit is_digit_check(input_string_with_single_digit)
65 ยตs ยฑ 20.6 ยตs per loop (mean ยฑ std. dev. of 7 runs, 10,000 loops each)
%timeit lambda_check(input_string_random)
114 ยตs ยฑ 8.77 ยตs per loop (mean ยฑ std. dev. of 7 runs, 10,000 loops each)
%timeit lambda_check(input_string_with_single_digit)
119 ยตs ยฑ 6.23 ยตs per loop (mean ยฑ std. dev. of 7 runs, 10,000 loops each)
%timeit regex_check(input_string_random)
996 ns ยฑ 19.8 ns per loop (mean ยฑ std. dev. of 7 runs, 1,000,000 loops each)
%timeit regex_check(input_string_with_single_digit)
22.2 ยตs ยฑ 1.77 ยตs per loop (mean ยฑ std. dev. of 7 runs, 10,000 loops each)

Dengan jumlah hit yang rendah โ€“ Ekspresi Reguler adalah yang memiliki performa paling tinggi. Dengan banyak hit, pendekatan fungsi lambda adalah yang paling berkinerja, dan memang demikian mempertahankan kompleksitas waktunya terlepas dari apakah inputnya memiliki banyak hit atau satu. Kelemahan utama (perhitungan berlebihan ketika hit rate rendah) diubah menjadi kekuatan utamanya karena redundansi membuatnya kuat untuk melakukan input.

Kesimpulan

Dalam tutorial ini, kita melihat berbagai cara untuk memeriksa apakah sebuah string di Python berisi setidaknya satu karakter. Kami telah melihat ord(), isnumeric(), isdigit() dan isdecimal() fungsi, serta cara mengabstraksi logika ini dengan pemanggilan fungsi lambda menggunakan map() dan any(). Kemudian, kami menjelajahi Ekspresi Reguler dan membandingkan pendekatannya dengan berbagai masukan.

Stempel Waktu:

Lebih dari penyalahgunaan