النصوص (Strings) هي من أهم أنواع البيانات في أي لغة برمجة. في هذا الفصل، ستتعلم كيفية التعامل مع النصوص بشكل احترافي: تقسيمها، دمجها، البحث والاستبدال، تنظيفها، وتحليلها. ستكتشف الدوال المدمجة القوية في Python التي تجعل معالجة النصوص سهلة وفعالة.

1. أساسيات العمل مع النصوص

Python توفر مجموعة كبيرة من الدوال المدمجة للعمل مع النصوص. لنبدأ بالأساسيات:

مثال 1: الدوال الأساسية للنصوص
string_basics.py
# النص الأساسي
text = "مرحبا بك في عالم البرمجة"

# 1. الطول (length)
print(f"طول النص: {len(text)}")
# النتيجة: طول النص: 27

# 2. تحويل إلى أحرف كبيرة
print(text.upper())
# النتيجة: مرحبا بك في عالم البرمجة (النص العربي لا يتغير)

# 3. تحويل إلى أحرف صغيرة
text_en = "HELLO WORLD"
print(text_en.lower())
# النتيجة: hello world

# 4. عكس النص
print(text[::-1])
# النتيجة: ةجمربلا ملاع يف كب ابحرم

# 5. البحث عن موضع كلمة
print(text.find("عالم"))
# النتيجة: 15 (موضع بدء "عالم")
النتيجة
طول النص: 27 مرحبا بك في عالم البرمجة hello world ةجمربلا ملاع يف كب ابحرم 15

شرح الكود: - `len()` تعطيك عدد الأحرف في النص - `upper()` و `lower()` لتحويل الحالة - `[::-1]` لعكس النص (slicing بخطوة -1) - `find()` للبحث عن موضع كلمة (ترجع -1 إذا لم تجد)

مثال 2: الفحوصات والبحث
string_checks.py
# النص
text = "مرحبا بك في عالم البرمجة"

# 1. التحقق من وجود كلمة
print("عالم" in text)  # True
print("بايثون" in text)  # False

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

# 3. عد عدد مرات كلمة
text = "أحب البرمجة وأحب بايثون وأحب التعلم"
print(text.count("أحب"))
# النتيجة: 3

# 4. العثور على موضع وعد المرات
print("عدد مرات 'الم':", text.count("الم"))
# النتيجة: عدد مرات 'الم': 2
النتيجة
True False True True 3 عدد مرات 'الم': 2

شرح الكود: - `in` للتحقق من وجود نص داخل نص آخر - `startswith()` و `endswith()` للتحقق من البداية والنهاية - `count()` لعد عدد مرات كلمة أو حرف معين

2. التقسيم (Split) والدمج (Join)

من أهم العمليات في معالجة النصوص هي تقسيم النص إلى أجزاء ودمج الأجزاء مرة أخرى.

مثال 1: التقسيم البسيط
string_split.py
# النص
text = "مرحبا بك في عالم البرمجة"

# 1. التقسيم على مسافة (افتراضي)
words = text.split()
print(words)
# النتيجة: ['مرحبا', 'بك', 'في', 'عالم', 'البرمجة']

# 2. التقسيم على فاصل معين
csv_data = "أحمد,85,الهندسة"
parts = csv_data.split(",")
print(parts)
# النتيجة: ['أحمد', '85', 'الهندسة']

# 3. التقسيم مع عدد أقسام محدود
text = "أ-ب-ج-د-هـ"
result = text.split("-", 2)  # قسّم على أول 2 فاصل فقط
print(result)
# النتيجة: ['أ', 'ب', 'ج-د-هـ']

# 4. التقسيم على حرف معين
email = "user@example.com"
name, domain = email.split("@")
print(f"الاسم: {name}, النطاق: {domain}")
# النتيجة: الاسم: user، النطاق: example.com
النتيجة
['مرحبا', 'بك', 'في', 'عالم', 'البرمجة'] ['أحمد', '85', 'الهندسة'] ['أ', 'ب', 'ج-د-هـ'] الاسم: user، النطاق: example.com

شرح الكود: - `split()` بدون معاملات يقسّم على أي مسافة بيضاء - `split(",")` يقسّم على فاصل محدد - `split("-", 2)` يقسّم على أول عدد معين من الفواصل - يمكنك استخدام unpacking لتوزيع النتائج على متغيرات

مثال 2: الدمج
string_join.py
# قائمة من الكلمات
words = ["مرحبا", "بك", "في", "عالم", "البرمجة"]

# 1. الدمج على مسافة
result = " ".join(words)
print(result)
# النتيجة: مرحبا بك في عالم البرمجة

# 2. الدمج على فاصل معين
items = ["أحمد", "85", "الهندسة"]
csv = ",".join(items)
print(csv)
# النتيجة: أحمد,85,الهندسة

# 3. الدمج على خط جديد
lines = ["السطر الأول", "السطر الثاني", "السطر الثالث"]
result = "\n".join(lines)
print(result)
# النتيجة:
# السطر الأول
# السطر الثاني
# السطر الثالث

# 4. دمج مع تحويل الأرقام إلى نصوص
numbers = [1, 2, 3, 4, 5]
result = "-".join(str(n) for n in numbers)
print(result)
# النتيجة: 1-2-3-4-5
النتيجة
مرحبا بك في عالم البرمجة أحمد,85,الهندسة السطر الأول السطر الثاني السطر الثالث 1-2-3-4-5

شرح الكود: - `join()` تدمج عناصر قائمة مع فاصل معين - أفضل طريقة من استخدام `+` في حلقة (أسرع وأنظف) - يمكن استخدام generator expression مع join لتحويل الأنواع

3. البحث والاستبدال (Replace)

البحث والاستبدال من العمليات الشائعة جداً في معالجة النصوص.

مثال 1: الاستبدال البسيط
string_replace.py
# النص
text = "أحب البرمجة وأحب بايثون وأحب التعلم"

# 1. استبدال كل المرات
result = text.replace("أحب", "أفضل")
print(result)
# النتيجة: أفضل البرمجة وأفضل بايثون وأفضل التعلم

# 2. استبدال عدد معين من المرات
result = text.replace("أحب", "أفضل", 2)  # استبدال أول مرتين فقط
print(result)
# النتيجة: أفضل البرمجة وأفضل بايثون وأحب التعلم

# 3. التحقق من عدد الاستبدالات
text = "hello hello hello"
result = text.replace("hello", "hi")
count = text.count("hello")
print(f"تم استبدال {count} مرات")
# النتيجة: تم استبدال 3 مرات

# 4. استبدال متعدد الخطوات
text = "Hello, World!"
result = text.replace(",", " -").replace("!", ".")
print(result)
# النتيجة: Hello -  World.
النتيجة
أفضل البرمجة وأفضل بايثون وأفضل التعلم أفضل البرمجة وأفضل بايثون وأحب التعلم تم استبدال 3 مرات Hello - World.

شرح الكود: - `replace(old, new)` يستبدل كل مرات القديم بالجديد - `replace(old, new, count)` يستبدل عدد معين من المرات - يمكن ربط عدة `replace()` معاً

مثال 2: البحث المتقدم
string_search.py
# النص
text = "مرحبا بك في عالم البرمجة في بايثون"

# 1. البحث عن أول موضع
pos = text.find("في")
print(f"أول موضع لـ 'في': {pos}")
# النتيجة: أول موضع لـ 'في': 12

# 2. البحث عن آخر موضع
pos = text.rfind("في")
print(f"آخر موضع لـ 'في': {pos}")
# النتيجة: آخر موضع لـ 'في': 25

# 3. البحث عن فهرس (يرفع خطأ إذا لم يجد)
try:
    pos = text.index("في")
    print(f"الفهرس: {pos}")
except ValueError:
    print("لم يتم العثور على النص")
# النتيجة: الفهرس: 12

# 4. البحث والاستبدال مع التعداد
text = "cat hat rat cat"
words = text.split()
for i, word in enumerate(words):
    if word == "cat":
        words[i] = "dog"
print(" ".join(words))
# النتيجة: dog hat rat dog
النتيجة
أول موضع لـ 'في': 12 آخر موضع لـ 'في': 25 الفهرس: 12 dog hat rat dog

شرح الكود: - `find()` ترجع -1 إذا لم تجد - `rfind()` تبحث من النهاية - `index()` ترفع استثناء إذا لم تجد - يمكن دمج البحث مع التعديل باستخدام enumerate

4. تنظيف وتعديل النصوص

تنظيف النصوص من المسافات والأحرف الزائدة عملية مهمة جداً.

مثال 1: إزالة المسافات
string_strip.py
# النص مع مسافات زائدة
text = "   مرحبا بك في عالم البرمجة   "

# 1. إزالة المسافات من الطرفين
result = text.strip()
print(f"'{result}'")
# النتيجة: 'مرحبا بك في عالم البرمجة'

# 2. إزالة من اليسار فقط
result = text.lstrip()
print(f"'{result}'")
# النتيجة: 'مرحبا بك في عالم البرمجة   '

# 3. إزالة من اليمين فقط
result = text.rstrip()
print(f"'{result}'")
# النتيجة: '   مرحبا بك في عالم البرمجة'

# 4. إزالة حرف معين من الطرفين
text = "###مرحبا###"
result = text.strip("#")
print(result)
# النتيجة: مرحبا

# 5. إزالة مسافات زائدة من الوسط
text = "مرحبا    بك    في    البرمجة"
result = " ".join(text.split())
print(result)
# النتيجة: مرحبا بك في البرمجة
النتيجة
'مرحبا بك في عالم البرمجة' 'مرحبا بك في عالم البرمجة ' ' مرحبا بك في عالم البرمجة' مرحبا مرحبا بك في البرمجة

شرح الكود: - `strip()` تزيل المسافات من الطرفين - `lstrip()` من اليسار فقط، `rstrip()` من اليمين فقط - يمكن تمرير حرف معين بدلاً من المسافة - `split().join()` تزيل كل المسافات الزائدة من الوسط

مثال 2: تحويل الحالة
string_case.py
# النصوص
text = "Hello World"

# 1. تحويل إلى أحرف كبيرة
print(text.upper())
# النتيجة: HELLO WORLD

# 2. تحويل إلى أحرف صغيرة
print(text.lower())
# النتيجة: hello world

# 3. تحويل أول حرف فقط إلى كبير
print(text.capitalize())
# النتيجة: Hello world

# 4. تحويل أول حرف من كل كلمة إلى كبير
print(text.title())
# النتيجة: Hello World

# 5. عكس الحالة
print(text.swapcase())
# النتيجة: hELLO wORLD
النتيجة
HELLO WORLD hello world Hello world Hello World hELLO wORLD

شرح الكود: - `upper()` يحول كل الأحرف إلى كبيرة - `lower()` يحول كل الأحرف إلى صغيرة - `capitalize()` يحول أول حرف فقط إلى كبير والباقي إلى صغير - `title()` يحول أول حرف من كل كلمة إلى كبير - `swapcase()` يعكس الحالة

5. التحقق من نوع ومحتوى النص

Python توفر دوال للتحقق من نوع محتوى النص بسهولة.

مثال: التحقق من النصوص
string_validation.py
# نصوص مختلفة
text1 = "12345"
text2 = "Hello"
text3 = "Hello123"
text4 = "   "

# 1. التحقق من أن كل الأحرف أرقام
print(text1.isdigit())  # True
print(text2.isdigit())  # False

# 2. التحقق من أن كل الأحرف حروف
print(text2.isalpha())  # True
print(text3.isalpha())  # False

# 3. التحقق من أن كل الأحرف حروف أو أرقام
print(text3.isalnum())  # True
print(text4.isalnum())  # False

# 4. التحقق من أن كل الأحرف مسافات
print(text4.isspace())  # True
print(text2.isspace())  # False

# 5. التحقق من أن النص فارغ
text_empty = ""
print(text_empty == "")  # True
print(len(text_empty) == 0)  # True

# 6. التحقق من أحرف كبيرة وصغيرة
text = "HELLO"
print(text.isupper())  # True
print(text.islower())  # False

text2 = "hello"
print(text2.isupper())  # False
print(text2.islower())  # True
النتيجة
True False True False True False True False True True True False False True

شرح الكود: - `isdigit()` للتحقق من أن كل الأحرف أرقام - `isalpha()` للتحقق من أن كل الأحرف حروف - `isalnum()` للتحقق من أن كل الأحرف حروف أو أرقام - `isspace()` للتحقق من أن كل الأحرف مسافات - `isupper()` و `islower()` للتحقق من الحالة

6. أمثلة عملية متقدمة

مثال 1: معالجة البريد الإلكتروني
email_validation.py
# قائمة رسائل بريد إلكترونية
emails = [
    "  user@example.com  ",
    "ADMIN@COMPANY.COM",
    "test_user@mail.co.uk",
    "  invalid-email  ",
    "another@domain.net  "
]

# معالجة البريد الإلكترونية
for email in emails:
    # تنظيف المسافات
    email_clean = email.strip().lower()
    
    # التحقق من وجود @
    if "@" in email_clean:
        # فصل الاسم والنطاق
        name, domain = email_clean.split("@")
        
        print(f"الاسم: {name}")
        print(f"النطاق: {domain}")
        print("---")
    else:
        print(f"بريد إلكتروني غير صحيح: {email_clean}")
        print("---")
النتيجة
الاسم: user النطاق: example.com --- الاسم: admin النطاق: company.com --- الاسم: test_user النطاق: mail.co.uk --- بريد إلكتروني غير صحيح: invalid-email --- الاسم: another النطاق: domain.net ---

شرح الكود: - نظفنا المسافات بـ `strip()` - حولنا إلى أحرف صغيرة بـ `lower()` - تحققنا من وجود @ بـ `in` - فصلنا الاسم والنطاق بـ `split()`

مثال 2: تحليل CSV
csv_parsing.py
# بيانات CSV
csv_data = """الاسم,العمر,القسم
أحمد,25,الهندسة
فاطمة,28,الطب
محمد,23,الحاسوب
سارة,26,التمريض"""

# فصل الأسطر
lines = csv_data.strip().split("\n")

# استخراج الرؤوس
headers = lines[0].split(",")
print("الأعمدة:", headers)

# معالجة البيانات
for line in lines[1:]:
    values = line.split(",")
    data = {headers[i]: values[i] for i in range(len(headers))}
    print(f"الاسم: {data['الاسم']}")
    print(f"العمر: {data['العمر']}")
    print(f"القسم: {data['القسم']}")
    print("---")
النتيجة
الأعمدة: ['الاسم', 'العمر', 'القسم'] الاسم: أحمد العمر: 25 القسم: الهندسة --- الاسم: فاطمة العمر: 28 القسم: الطب --- الاسم: محمد العمر: 23 القسم: الحاسوب --- الاسم: سارة العمر: 26 القسم: التمريض ---