توفر بايثون عدة طرق فعالة لتحديد ما إذا كانت سلسلة نصية تحتوي على رقم واحد على الأقل. هذه مهمة شائعة في التحقق من صحة البيانات، وتنقية المدخلات، والعديد من سيناريوهات معالجة السلاسل النصية. تستعرض هذه المقالة ثلاث طرق فعالة: استخدام دالة any()
مع str.isdigit()
، واستخدام دالة map()
، والاستفادة من التعبيرات النمطية مع re.search()
.
جدول المحتويات
التحقق من وجود الأرقام بكفاءة باستخدام any()
و isdigit()
يُعتبر هذا النهج غالبًا الأكثر شيوعًا وسهولة القراءة في بايثون. فهو يستخدم دالة any()
للتحقق بإيجاز مما إذا كانت حرف واحد على الأقل يفي بشرط isdigit()
.
def contains_number_any(input_string):
"""
يتحقق مما إذا كانت السلسلة النصية تحتوي على رقم واحد على الأقل باستخدام any() و isdigit().
Args:
input_string: السلسلة النصية المراد التحقق منها.
Returns:
True إذا كانت السلسلة النصية تحتوي على رقم واحد على الأقل، False بخلاف ذلك.
"""
return any(char.isdigit() for char in input_string)
# أمثلة
print(contains_number_any("abc1def")) # ناتج: True
print(contains_number_any("abcdef")) # ناتج: False
print(contains_number_any("123abc")) # ناتج: True
print(contains_number_any("")) # ناتج: False
يكرر الكود عبر كل حرف. ترجع char.isdigit()
قيمة True
للأرقام (0-9)، و False
بخلاف ذلك. ترجع any()
قيمة True
فور العثور على رقم، مما يحسن الكفاءة.
استخدام دالة map()
للكشف عن الأرقام بإيجاز
توفر دالة map()
بديلاً مختصراً. فهي تطبق isdigit()
على كل حرف ثم تتحقق مما إذا كانت أي نتيجة تساوي True
.
def contains_number_map(input_string):
"""
يتحقق مما إذا كانت السلسلة النصية تحتوي على رقم واحد على الأقل باستخدام map() و isdigit().
Args:
input_string: السلسلة النصية المراد التحقق منها.
Returns:
True إذا كانت السلسلة النصية تحتوي على رقم واحد على الأقل، False بخلاف ذلك.
"""
return any(map(str.isdigit, input_string))
# أمثلة
print(contains_number_map("abc1def")) # ناتج: True
print(contains_number_map("abcdef")) # ناتج: False
print(contains_number_map("123abc")) # ناتج: True
print(contains_number_map("")) # ناتج: False
على الرغم من أنها مشابهة وظيفيًا لطريقة any()
، إلا أن map()
قد تكون أقل قابلية للقراءة قليلاً بالنسبة لأولئك الذين ليسوا على دراية بسلوكها. الأداء متشابه.
الاستفادة من التعبيرات النمطية لمطابقة الأنماط
توفر التعبيرات النمطية حلاً مرنًا، خاصةً للنماط الأكثر تعقيدًا. يوفر re.search()
مع نمط d
(مطابقة أي رقم) نهجًا مختصراً.
import re
def contains_number_regex(input_string):
"""
يتحقق مما إذا كانت السلسلة النصية تحتوي على رقم واحد على الأقل باستخدام التعبيرات النمطية.
Args:
input_string: السلسلة النصية المراد التحقق منها.
Returns:
True إذا كانت السلسلة النصية تحتوي على رقم واحد على الأقل، False بخلاف ذلك.
"""
return bool(re.search(r'd', input_string))
# أمثلة
print(contains_number_regex("abc1def")) # ناتج: True
print(contains_number_regex("abcdef")) # ناتج: False
print(contains_number_regex("123abc")) # ناتج: True
print(contains_number_regex("")) # ناتج: False
يرجع re.search()
كائن تطابق إذا تم العثور عليه، أو None
بخلاف ذلك. يوفر التحويل إلى قيمة منطقية النتيجة True/False. على الرغم من إيجازه، إلا أن هذا قد يكون أقل كفاءة قليلاً من الطرق السابقة للكشف عن الأرقام البسيطة في السلاسل النصية الطويلة جدًا، لكن قوته تكمن في التعامل مع السيناريوهات المعقدة.
باختصار، جميع الطرق الثلاث تتحقق بفعالية من وجود الأرقام. يُفضل عمومًا استخدام طريقة any()
مع isdigit()
لقابلية قراءتها وكفاءتها في هذه الحالة المحددة. ومع ذلك، فإن فهم map()
و re.search()
يوفر مرونة قيّمة لمعالجة السلاسل النصية الأكثر تقدمًا.