اذهب إلى المحتوى
  • 0

مشكلة عند استخدام pattern - بايثون

Alaa Jamal

السؤال

Recommended Posts

  • 1
import re          # regex  استيراد المكتبة 
txt = input()       #  إدخال النص


result = re.findall("056\d{7}", txt)    # أي أول 3 محارف يجب أن يكونوا056 وبعدها 7 أرقام

# عرض النتائج
if result:
    for word in result:
        print(word)
else:
    print("No ID!")

الرمز d\ يدل على وجود رقم 

الرمز {7} يدل على أن المحرف الموجود قبلها يجب أن يتكرر 7 مرات وفي حالتنا (d\ أي يجب أن يتواجد 7 أرقام)

الدالة (pattern,string)findall  تبحث في النص الذي نمرره له مكان الباراميتر string لترى ما إذا كان يتطابق أو فيه جزء يتطابق مع التعبير النمطي الذي نمرره لها مكان الباراميتر pattern. في حال تم إيجاد جزء أو أكثر في النص يتطابق مع التعبير النمطي, ترجع list كل عنصر فيه يمثل الجزء الذي يتطابق مع التعبير النمطي.
في حال لم يتم إيجاد أي تطابق, ترجع list فارغ.

# تعدييييييل:
الرمز ^ يختبر فقط بداية النص أي سيختبر مطابقة ال pattern  مع أول كلمة في ال string لذلك لايصلح لاستخدامه في هذه المهمة وبشكل مشابه أيضاً المحرف $.

تم التعديل في بواسطة Ali Haidar Ahmad
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 1

بمراجعة المطلوب في السؤال، أجد انه لا يشترط إدخال قيمة رقمية فقط كما قمت بحله، الحل المذكور في إجابتك صحيح لكن فقط في حال كانت القيمة المدخلة من قبل المستخدم رقمية فقط، أما إن اردنا إدخال كل الإحتمالات فيجب علينا أن نستخدم دالة لفرز الأرقام من المدخل اولاً ثم تطبيق الشرط كالتالي:

import re

text = input('enter the text')
expp = "056\d{7}"

newtext = re.findall(r'\d+', text)
newtext

لقد قمت بحذف شرطية إبتداء النص ب 056 بحذف ^ و ايضاً حذف شرطية الإنتهاء بالسبعة أرقام كاملة و ذلك بحذف $ من نهاية النص، بذلك نتفادي اي خطأ قابل حدوثه من قبل المستخدم، شرطنا الوحيد وجود 056 في مجموعة الأرقام التي قمنا بالحصول عليها بتطبيق دالة findall و بإستخدام شرط إستخراج القيم الرقمية \d ومن ثم نقوم بإدارج الشرط الثاني لفلترة الأرقام و إستخراج المطابق للمطلوب في الأرقام الوطنية كالتالي:

exp = re.findall(expp, newtext[0])
print(exp)

و الان إن قمنا بإختبار البرنامج بإدخال نفس النص "Hello my Jawwal number is 0560000001 " سنحصل على الرقم 0560000001. يمكننا ملاحظة أننا قمنا بإستدعاء اول قيمة في النص الجديد newtext[0] و ذلك لأن القيمة الراجعة عبارة عن قائمة محتوية على النص.

والأن السؤال يتطلب إنشاء دالة، بذلك يمكننا إنشاء الدالة بإستخدام الدوال اعلاه فيصبح البرنامج كاملاً كالتالي:

def nationalNo(text, exp = '05[6|9]\d{7}'):
  return re.findall(expp, (re.findall(r'\d+', text))[0])

nationalNo('Hello my Jawwal number is 0560000001')

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...