Python String Processing

كشف فعال للأرقام في سلاسل نصوص بايثون

Spread the love

توفر بايثون عدة طرق فعالة لتحديد ما إذا كانت سلسلة نصية تحتوي على رقم واحد على الأقل. هذه مهمة شائعة في التحقق من صحة البيانات، وتنقية المدخلات، والعديد من سيناريوهات معالجة السلاسل النصية. تستعرض هذه المقالة ثلاث طرق فعالة: استخدام دالة any() مع str.isdigit()، واستخدام دالة map()، والاستفادة من التعبيرات النمطية مع re.search().

جدول المحتويات

  1. استخدام any() و isdigit()
  2. استخدام دالة map()
  3. استخدام التعبيرات النمطية

التحقق من وجود الأرقام بكفاءة باستخدام 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() يوفر مرونة قيّمة لمعالجة السلاسل النصية الأكثر تقدمًا.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *