Python Programming

استخراج الأرقام بكفاءة من السلاسل النصية في بايثون

Spread the love

استخراج البيانات العددية من السلاسل النصية مهمة شائعة في برمجة بايثون، خاصةً في تنظيف البيانات و استخراج البيانات من الويب. تستكشف هذه المقالة عدة طرق فعّالة ومتنوعة لتحقيق ذلك، لتناسب مختلف السيناريوهات ومستويات التعقيد.

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

الطريقة الأولى: استخدام التعابير النمطية

توفر التعابير النمطية (regex) نهجًا قويًا ومرنًا، خاصةً لهياكل السلاسل النصية المعقدة. تسهل وحدة re في بايثون هذه العملية.


import re

def extract_numbers_regex(text):
  """يستخرج الأعداد من سلسلة نصية باستخدام التعابير النمطية."""
  numbers = re.findall(r'-?d+(.d+)?', text)  # يطابق الأعداد الصحيحة والعشرية، بما في ذلك الأعداد السالبة
  return [float(num) for num in numbers]

text = "There are -12 apples and 3.14 oranges, and also 12345."
numbers = extract_numbers_regex(text)
print(numbers)  # الإخراج: [-12.0, 3.14, 12345.0]

يُحسّن هذا التعبير النمطي r'-?d+(.d+)?' معالجة الأعداد السالبة والعشرية بفعالية.

الطريقة الثانية: استخدام الفهم بالقائمة

يوفر الفهم بالقائمة حلًا مختصرًا وذو أسلوب بايثوني، مثاليًا للسيناريوهات البسيطة حيث تكون الأعداد محددة بوضوح.


def extract_numbers_list_comprehension(text):
  """يستخرج الأعداد الصحيحة من سلسلة نصية باستخدام الفهم بالقائمة."""
  return [int(c) for c in text if c.isdigit()]

text = "123abc456"
numbers = extract_numbers_list_comprehension(text)
print(numbers)  # الإخراج: [1, 2, 3, 4, 5, 6]

هذه الطريقة فعّالة لاستخراج الأرقام المفردة، لكنها قد لا تكون مناسبة للأعداد المكوّنة من أكثر من رقم أو الأعداد التي تحتوي على فاصل عشري.

الطريقة الثالثة: دمج filter و isdigit()

يستخدم هذا النهج الوظيفي filter() و isdigit() لحل واضح وسهل القراءة مناسب للحالات البسيطة.


def extract_numbers_filter(text):
  """يستخرج الأعداد الصحيحة من سلسلة نصية باستخدام filter و isdigit()."""
  numbers = list(filter(str.isdigit, text))
  return [int(num) for num in numbers]

text = "1a2b3c4d5"
numbers = extract_numbers_filter(text)
print(numbers) #الإخراج: [1, 2, 3, 4, 5]

على غرار الفهم بالقائمة، تستخرج هذه الطريقة الأرقام المفردة ولا تعالج صيغ الأعداد الأكثر تعقيدًا.

الطريقة الرابعة: التعابير النمطية المتقدمة للأنماط المعقدة

تُبرز التعابير النمطية قوتها عند معالجة الأنماط المعقدة، مثل الأعداد بالترميز العلمي أو مع فواصل الآلاف.


import re

def extract_numbers_complex(text):
    """يستخرج الأعداد (بما في ذلك الترميز العلمي) من سلسلة نصية باستخدام التعابير النمطية."""
    numbers = re.findall(r'-?d+(?:,d{3})*(?:.d+)?(?:[eE][+-]?d+)?', text)
    return [float(num.replace(',', '')) for num in numbers]

text = "The price is $1,234.56 and the quantity is 1.23e-5. Another price is 100,000"
numbers = extract_numbers_complex(text)
print(numbers) # الإخراج: ['1234.56', '1.23e-5', '100000']

يعالج هذا التعبير النمطي الفواصل كفواصل آلاف والترميز العلمي. تقوم الدالة replace(',', '') بإزالة الفواصل قبل التحويل إلى قيمة عشرية.

معالجة الاختلافات في صيغ الأعداد

للتكيّف مع مختلف الصيغ، ضع في اعتبارك هذه النقاط:

  • الأعداد السالبة: أضف -? في بداية نمط التعبير النمطي الخاص بك (مثلًا، r'-?d+').
  • الترميز العلمي: أضف (?:[eE][+-]?d+)? لمعالجة الأسس (كما هو موضح في الطريقة الرابعة).
  • فواصل الآلاف: استخدم (?:,d{3})* لمطابقة فواصل الآلاف الاختيارية (كما هو موضح في الطريقة الرابعة).
  • رموز العملات: قم بمعالجة سلسلتك النصية مسبقًا لإزالة رموز العملات قبل الاستخراج، أو استخدم تعبيرًا نمطيًا أكثر تعقيدًا.

الخلاصة

تعتمد الطريقة المثلى على تعقيد سلاسل الإدخال الخاصة بك والدقة المطلوبة. في الحالات البسيطة، قد يكفي الفهم بالقائمة أو filter. ومع ذلك، من أجل المتانة ومعالجة صيغ الأعداد المتنوعة، تعد التعابير النمطية لا تقدر بثمن.

اترك تعليقاً

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