الفصل 06

التعامل مع النصوص — الفهرسة، التقطيع، ونصوص التنسيق (f-strings)

استخراج أجزاء من النصوص، وتنظيفها، وتعديلها، وبناء رسائل واضحة باستخدام f-strings — مع قاعدة أن النصوص غير قابلة للتعديل المباشر في مكانها.

35 دقيقةPython 3.12
  1. 1المشكلة
  2. 2الفهم
  3. 3أمثلة محلولة
  4. 4التوقع
  5. 5التطبيق
  6. 6التحدي

المشكلة التي نقوم بحلها

وصلك اسم مستخدم من نموذج تسجيل: " Rafi Ahmed ". مسافات زائدة في الطرفين، والمطلوب استخراج الاسم الأول فقط مع رسالة ترحيبية — "Welcome, Rafi!".

معالجة النصوص وتعديلها واستخراج أجزاء منها هي واحدة من أكثر المهام تكراراً في البرمجة: أسماء المستخدمين، عناوين البريد الإلكتروني، المعرفات، ومخرجات الـ API جميعها بيانات نصية.

وسيتضح لك اليوم مبدأ أساسي يوفر ساعات من الحيرة: في بايثون، النصوص غير قابلة للتعديل المباشر في مكانها (Strings are immutable). كتابة name.upper() لا تجعل المتغير name بحروف كبيرة من تلقاء نفسه. معرفة هذا المبدأ وكيفية التعامل معه هي أهم ما ستتعلمه في هذه المهمة.

بنهاية هذه المهمة ستكون قادراً على

  • الوصول إلى أي حرف عبر موقعه (Index) من البداية أو النهاية
  • قص جزء محدد من النص باستخدام التقطيع (Slicing)
  • تنظيف النصوص وتعديلها عبر دوال strip و upper و lower و replace و split
  • فهم سبب ضرورة حفظ نتيجة أي دالة نصية داخل متغير
  • بناء نصوص منسقة واضحة باستخدام نصوص التنسيق (f-strings)

المتطلبات المسبقة: المتغيرات والأنواع.


علامات التنصيص في بايثون

علامات التنصيص المفردة 'Rafi' والمزدوجة "Rafi" متطابقتان تماماً في بايثون. ووجودهما معاً يفيد لتجنب أخطاء وجود علامات تنصيص داخل النص نفسه:

python
print("It's working")
print('She said "yes"')
text
It's working
She said "yes"

وعلامات التنصيص الثلاثية (""") تُستخدم لكتابة نصوص تمتد لعدة أسطر:

python
note = """Dear customer,
Your order is confirmed.
Thank you."""
print(note)
text
Dear customer,
Your order is confirmed.
Thank you.

مثال تطبيقي متكامل

account.py:

python
# Turn a raw form entry into a clean display name and a login id
raw_input_name = "   Rafi Ahmed   "
domain = "example.com"

clean = raw_input_name.strip()
parts = clean.split(" ")
first_name = parts[0]
last_name = parts[-1]

login_id = f"{first_name.lower()}.{last_name.lower()}"
email = f"{login_id}@{domain}"
initials = f"{first_name[0]}{last_name[0]}"

print(f"Display name : {clean}")
print(f"Login id     : {login_id}")
print(f"Email        : {email}")
print(f"Initials     : {initials}")
print(f"Name length  : {len(clean)} characters")
text
Display name : Rafi Ahmed
Login id     : rafi.ahmed
Email        : rafi.ahmed@example.com
Initials     : RA
Name length  : 10 characters

لماذا استخدمنا parts[-1]؟ لأن الاسم قد يتكون من كلمتين أو ثلاث، وأخذ الجزء الأخير من الخلف عبر المؤشر السلبي يضمن نجاح الكود في الحالتين.


الأخطاء الشائعة وحلولها

خطأ IndexError: string index out of range الفهرس المطلوب يتجاوز طول النص. إذا كان طول الكلمة 6 أحرف، فالفهارس الصالحة تبدأ من 0 حتى 5.

استدعاء الدالة دون تغير النص النصوص غير قابلة للتعديل المباشر. السطر name.strip() يعيد نصاً جديداً ولا يغير name نفسه. يجب عليك إسناد النتيجة: name = name.strip().

دالة strip() لم تحذف المسافات التي في المنتصف دالة strip() تحذف المسافات من الأطراف فقط. لحذف المسافات الداخلية استخدم replace(" ", "").