🔒

سجّل للوصول إلى الدروس

للاستمرار في تعلم بايثون، يرجى إنشاء حساب مجاني أو تسجيل الدخول إلى حسابك الحالي.

وصول مجاني لجميع دروس بايثون
حفظ تقدمك تلقائياً
بيئة تجربة بايثون التفاعلية
الوحدة 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"