الوحدة 3 • الدرس 12

النصوص المتقدمة (Strings)

إتقان التعامل مع النصوص وتنسيقها ومعالجتها

⏱️ 25 دقيقة 📊 متوسط 📝 معالجة النصوص

📝 مراجعة أساسيات النصوص

النصوص (Strings) هي تسلسلات من الأحرف غير قابلة للتغيير. تدعم الفهرسة والتقطيع والعديد من الدوال القوية لمعالجة النصوص.

Python إنشاء النصوص
# طرق إنشاء النصوص
نص_بسيط = 'مرحبا'
نص_مزدوج = "أهلا بالعالم"
نص_متعدد = '''هذا نص
يمتد على
عدة أسطر'''

# أحرف خاصة
سطر_جديد = "السطر الأول\nالسطر الثاني"
تاب = "الاسم:\tأحمد"
علامة_تنصيص = "قال \"مرحبا\""

# نص خام (raw string)
مسار = r"C:\Users\اسم"

# من أنواع أخرى
من_رقم = str(42)       # "42"
من_عشري = str(3.14)   # "3.14"
من_منطقي = str(True)  # "True"

🔍 الفهرسة والتقطيع

Python الوصول للأحرف
نص = "البرمجة بايثون"

# الفهرسة الإيجابية
print(نص[0])    # ا
print(نص[1])    # ل
print(نص[8])    # ب

# الفهرسة السلبية
print(نص[-1])   # ن
print(نص[-2])   # و

# التقطيع
print(نص[0:7])    # البرمجة
print(نص[8:])     # بايثون
print(نص[:7])     # البرمجة
print(نص[::2])    # الرج اتن (كل حرفين)
print(نص[::-1])   # نوثياب ةجمربلا (معكوس)

# الحصول على كلمة
أول_كلمة = نص[:نص.index(' ')]
print(f"أول كلمة: {أول_كلمة}")

🔤 تحويل حالة الأحرف

Python دوال تحويل الحالة
نص = "hello WORLD python"

print(نص.upper())       # HELLO WORLD PYTHON
print(نص.lower())       # hello world python
print(نص.title())       # Hello World Python
print(نص.capitalize())  # Hello world python
print(نص.swapcase())    # HELLO world PYTHON

# مقارنة بدون حساسية للحالة
اسم1 = "Ahmed"
اسم2 = "AHMED"
print(اسم1.lower() == اسم2.lower())  # True

# للنص العربي
عربي = "مرحبا بالعالم"
print(عربي.upper())  # لا تأثير على العربية
print(عربي.lower())  # لا تأثير على العربية

upper()

تحويل لأحرف كبيرة

lower()

تحويل لأحرف صغيرة

title()

أول حرف كبير لكل كلمة

capitalize()

أول حرف كبير فقط

swapcase()

عكس الحالة

🔎 البحث في النصوص

Python دوال البحث
نص = "البرمجة ممتعة، البرمجة مفيدة"

# البحث عن موقع
print(نص.find("البرمجة"))      # 0 (أول ظهور)
print(نص.find("البرمجة", 1))   # 15 (البحث بعد الموقع 1)
print(نص.find("جافا"))         # -1 (غير موجود)
print(نص.rfind("البرمجة"))     # 15 (آخر ظهور)

# index vs find
print(نص.index("ممتعة"))  # 8
# print(نص.index("جافا"))  # ValueError!

# عدد التكرارات
print(نص.count("البرمجة"))     # 2
print(نص.count("م"))          # 4

# التحقق من البداية والنهاية
print(نص.startswith("البرمجة"))  # True
print(نص.endswith("مفيدة"))     # True

# التحقق من عدة خيارات
print(نص.startswith(("مرحبا", "البرمجة")))  # True

# وجود نص فرعي
print("ممتعة" in نص)      # True
print("صعبة" not in نص)   # True
💡
الفرق بين find و index:

find() تعيد -1 إذا لم يوجد النص، بينما index() تسبب خطأ ValueError.

التحقق من النصوص

Python دوال التحقق
# التحقق من نوع الأحرف
print("abc".isalpha())       # True (أحرف فقط)
print("123".isdigit())       # True (أرقام فقط)
print("abc123".isalnum())    # True (أحرف وأرقام)
print("   ".isspace())       # True (مسافات فقط)

# التحقق من الحالة
print("HELLO".isupper())     # True
print("hello".islower())     # True
print("Hello World".istitle())  # True

# التحقق من الأرقام
print("42".isnumeric())      # True
print("3.14".isnumeric())    # False (النقطة ليست رقم)
print("-5".isnumeric())      # False (السالب ليس رقم)

# مثال عملي: التحقق من اسم المستخدم
def تحقق_من_اسم(اسم):
    if not اسم:
        return False, "الاسم فارغ"
    if not اسم[0].isalpha():
        return False, "يجب أن يبدأ بحرف"
    if not اسم.isalnum():
        return False, "أحرف وأرقام فقط"
    if len(اسم) < 3:
        return False, "3 أحرف على الأقل"
    return True, "صالح"

print(تحقق_من_اسم("user123"))  # (True, 'صالح')
print(تحقق_من_اسم("123user"))  # (False, 'يجب أن يبدأ بحرف')

✏️ تعديل النصوص

Python الاستبدال والتنظيف
# الاستبدال
نص = "مرحبا بالعالم"
print(نص.replace("العالم", "Python"))    # مرحبا بPython
print(نص.replace("ا", "أ"))              # مرحبأ بألعألم
print(نص.replace("ا", "أ", 1))           # مرحبأ بالعالم (مرة واحدة)

# إزالة المسافات
فوضوي = "   مرحبا بالعالم   "
print(فوضوي.strip())      # "مرحبا بالعالم"
print(فوضوي.lstrip())     # "مرحبا بالعالم   "
print(فوضوي.rstrip())     # "   مرحبا بالعالم"

# إزالة أحرف محددة
مسار = "///path/to/file///"
print(مسار.strip("/"))    # "path/to/file"

# الحشو والمحاذاة
اسم = "أحمد"
print(اسم.center(20))         # "        أحمد        "
print(اسم.center(20, "-"))    # "--------أحمد--------"
print(اسم.ljust(20, "."))     # "أحمد................"
print(اسم.rjust(20, "."))     # "................أحمد"

# حشو الأرقام بالأصفار
رقم = "42"
print(رقم.zfill(5))           # "00042"

✂️ التقسيم والدمج

Python split و join
# تقسيم النص إلى قائمة
نص = "تفاح,موز,برتقال"
فواكه = نص.split(",")
print(فواكه)  # ['تفاح', 'موز', 'برتقال']

# تقسيم بحد أقصى
نص = "واحد-اثنان-ثلاثة-أربعة"
print(نص.split("-", 2))     # ['واحد', 'اثنان', 'ثلاثة-أربعة']
print(نص.rsplit("-", 2))    # ['واحد-اثنان', 'ثلاثة', 'أربعة']

# التقسيم بالمسافات (افتراضي)
جملة = "مرحبا   بالعالم   الجميل"
print(جملة.split())         # ['مرحبا', 'بالعالم', 'الجميل']

# تقسيم الأسطر
متعدد = "السطر الأول\nالسطر الثاني\nالسطر الثالث"
أسطر = متعدد.splitlines()
print(أسطر)  # ['السطر الأول', 'السطر الثاني', 'السطر الثالث']

# دمج قائمة في نص
كلمات = ["مرحبا", "بالعالم", "الجميل"]
print(" ".join(كلمات))      # "مرحبا بالعالم الجميل"
print("-".join(كلمات))      # "مرحبا-بالعالم-الجميل"
print("".join(كلمات))       # "مرحبابالعالمالجميل"

# مثال عملي: تحويل CSV
csv = "الاسم,العمر,المدينة"
بيانات = csv.split(",")
print(بيانات)  # ['الاسم', 'العمر', 'المدينة']

# إعادة البناء
جديد = " | ".join(بيانات)
print(جديد)  # "الاسم | العمر | المدينة"

🎨 تنسيق النصوص

Python f-strings (الطريقة الحديثة)
اسم = "أحمد"
عمر = 25
سعر = 19.99

# الأساسيات
print(f"الاسم: {اسم}, العمر: {عمر}")
print(f"السعر: ${سعر}")
print(f"العمر بعد 5 سنوات: {عمر + 5}")

# تنسيق الأرقام
رقم = 1234567.89
print(f"افتراضي: {رقم}")
print(f"رقمين عشريين: {رقم:.2f}")
print(f"مع فواصل: {رقم:,.2f}")
print(f"نسبة مئوية: {0.756:.1%}")
print(f"علمي: {رقم:e}")

# المحاذاة والحشو
نص = "مرحبا"
print(f"|{نص:<10}|")    # |مرحبا     | (يسار)
print(f"|{نص:>10}|")    # |     مرحبا| (يمين)
print(f"|{نص:^10}|")    # |  مرحبا   | (وسط)
print(f"|{نص:*^10}|")   # |**مرحبا***| (حشو بـ *)

# تنسيق الأرقام
رقم = 42
print(f"ثنائي: {رقم:b}")     # 101010
print(f"ست عشري: {رقم:x}")   # 2a
print(f"ثماني: {رقم:o}")     # 52
Python طرق أخرى للتنسيق
# الطريقة format()
print("الاسم: {}, العمر: {}".format(اسم, عمر))
print("الاسم: {0}, العمر: {1}, {0} مجدداً".format(اسم, عمر))
print("الاسم: {n}, العمر: {a}".format(n=اسم, a=عمر))

# الطريقة القديمة %
print("الاسم: %s, العمر: %d" % (اسم, عمر))
print("السعر: %.2f" % سعر)

# مثال عملي: إنشاء جدول
طلاب = [
    ("أحمد", 95, "ممتاز"),
    ("سارة", 88, "جيد جداً"),
    ("محمد", 78, "جيد")
]

print(f"{'الاسم':^10} | {'الدرجة':^10} | {'التقدير':^10}")
print("-" * 36)
for طالب, درجة, تقدير in طلاب:
    print(f"{طالب:^10} | {درجة:^10} | {تقدير:^10}")

🌍 التعامل مع Unicode

Python أحرف Unicode
# أحرف Unicode
قلب = "\u2764"        # ❤
ابتسامة = "\U0001F600" # 😀
print(f"أحب Python {قلب}")
print(f"برمجة سعيدة {ابتسامة}")

# الحصول على رمز Unicode
print(ord("أ"))       # 1571
print(ord("❤"))       # 10084

# الحصول على الحرف من الرمز
print(chr(1571))      # أ
print(chr(10084))     # ❤

# تحويل إلى bytes
نص = "مرحبا 世界"
utf8_bytes = نص.encode("utf-8")
print(utf8_bytes)

# تحويل من bytes
مفكوك = utf8_bytes.decode("utf-8")
print(مفكوك)  # مرحبا 世界

# طول النص العربي
عربي = "مرحبا"
print(len(عربي))  # 5 (عدد الأحرف)

💼 أمثلة عملية

Python محلل النصوص
def تحليل_نص(نص):
    """تحليل نص وإرجاع إحصائيات"""
    كلمات = نص.split()
    عدد_الكلمات = len(كلمات)

    # عدد الأحرف (بدون المسافات)
    عدد_الأحرف = len(نص.replace(" ", ""))

    # عدد الجمل (تقريبي)
    جمل = [ج for ج in نص.replace("!", ".").replace("؟", ".").split(".") if ج.strip()]
    عدد_الجمل = len(جمل)

    # متوسط طول الكلمة
    إجمالي_أحرف = sum(len(كلمة) for كلمة in كلمات)
    متوسط_الطول = إجمالي_أحرف / عدد_الكلمات if عدد_الكلمات else 0

    return {
        "عدد_الكلمات": عدد_الكلمات,
        "عدد_الأحرف": عدد_الأحرف,
        "عدد_الجمل": عدد_الجمل,
        "متوسط_طول_الكلمة": round(متوسط_الطول, 2)
    }

نص = "البرمجة ممتعة جداً! أحب تعلم Python. هل تحبها أيضاً؟"
نتائج = تحليل_نص(نص)
for مفتاح, قيمة in نتائج.items():
    print(f"{مفتاح}: {قيمة}")
Python فاحص قوة كلمة المرور
def فحص_كلمة_مرور(كلمة):
    """فحص قوة كلمة المرور"""
    نقاط = 0
    ملاحظات = []

    # فحص الطول
    if len(كلمة) >= 12:
        نقاط += 2
    elif len(كلمة) >= 8:
        نقاط += 1
    else:
        ملاحظات.append("قصيرة جداً (8 أحرف على الأقل)")

    # فحص الأحرف الكبيرة
    if any(ح.isupper() for ح in كلمة):
        نقاط += 1
    else:
        ملاحظات.append("أضف أحرف كبيرة")

    # فحص الأحرف الصغيرة
    if any(ح.islower() for ح in كلمة):
        نقاط += 1
    else:
        ملاحظات.append("أضف أحرف صغيرة")

    # فحص الأرقام
    if any(ح.isdigit() for ح in كلمة):
        نقاط += 1
    else:
        ملاحظات.append("أضف أرقام")

    # فحص الرموز الخاصة
    رموز = "!@#$%^&*()_+-=[]{}|;:,.<>?"
    if any(ح in رموز for ح in كلمة):
        نقاط += 1
    else:
        ملاحظات.append("أضف رموز خاصة")

    # تحديد القوة
    if نقاط >= 6:
        قوة = "قوية 💪"
    elif نقاط >= 4:
        قوة = "متوسطة 👍"
    else:
        قوة = "ضعيفة ⚠️"

    return {
        "القوة": قوة,
        "النقاط": f"{نقاط}/7",
        "ملاحظات": ملاحظات
    }

# اختبار
كلمات = ["pass", "Password1", "P@ssw0rd123!"]
for كلمة in كلمات:
    نتيجة = فحص_كلمة_مرور(كلمة)
    print(f"\n{كلمة}:")
    print(f"  القوة: {نتيجة['القوة']}")
    print(f"  النقاط: {نتيجة['النقاط']}")
    if نتيجة['ملاحظات']:
        print(f"  نصائح: {', '.join(نتيجة['ملاحظات'])}")
Python منسق النص العربي
def تنظيف_نص_عربي(نص):
    """تنظيف وتنسيق نص عربي"""
    # إزالة المسافات الزائدة
    نص = " ".join(نص.split())

    # إزالة التشكيل (اختياري)
    تشكيل = "ًٌٍَُِّْ"
    for حركة in تشكيل:
        نص = نص.replace(حركة, "")

    return نص

def عكس_نص(نص):
    """عكس النص"""
    return نص[::-1]

def هل_متناظر(نص):
    """فحص إذا كان النص متناظر (palindrome)"""
    نص_نظيف = نص.replace(" ", "").lower()
    return نص_نظيف == نص_نظيف[::-1]

# أمثلة
print(تنظيف_نص_عربي("  مَرْحَبَا   بِكُمْ  "))
print(هل_متناظر("radar"))  # True
print(هل_متناظر("level"))  # True

🎯 تحديات تطبيقية

التحدي 1 سهل

عد الكلمات

اكتب دالة تحسب عدد الكلمات في نص.

def عدد_الكلمات(نص):
    # أكمل الدالة
    pass

print(عدد_الكلمات("مرحبا بالعالم الجميل"))  # 3
عرض الحل
def عدد_الكلمات(نص):
    return len(نص.split())

print(عدد_الكلمات("مرحبا بالعالم الجميل"))  # 3
التحدي 2 متوسط

عكس الكلمات

اكتب دالة تعكس ترتيب الكلمات في جملة (وليس الأحرف).

def عكس_الكلمات(جملة):
    # أكمل الدالة
    pass

print(عكس_الكلمات("مرحبا بالعالم"))  # "بالعالم مرحبا"
عرض الحل
def عكس_الكلمات(جملة):
    كلمات = جملة.split()
    return " ".join(reversed(كلمات))

print(عكس_الكلمات("مرحبا بالعالم"))  # "بالعالم مرحبا"
التحدي 3 متقدم

ضغط النص

اكتب دالة تضغط النص بحساب تكرار الأحرف المتتالية.

def ضغط_نص(نص):
    # "aaabbc" -> "a3b2c1"
    pass

print(ضغط_نص("aaabbc"))     # "a3b2c1"
print(ضغط_نص("aabbcccc"))   # "a2b2c4"
عرض الحل
def ضغط_نص(نص):
    if not نص:
        return ""

    نتيجة = []
    الحرف_الحالي = نص[0]
    عداد = 1

    for حرف in نص[1:]:
        if حرف == الحرف_الحالي:
            عداد += 1
        else:
            نتيجة.append(f"{الحرف_الحالي}{عداد}")
            الحرف_الحالي = حرف
            عداد = 1

    نتيجة.append(f"{الحرف_الحالي}{عداد}")
    return "".join(نتيجة)

print(ضغط_نص("aaabbc"))     # "a3b2c1"
print(ضغط_نص("aabbcccc"))   # "a2b2c4"