النصوص (Strings) هي من أهم أنواع البيانات في أي لغة برمجة. في هذا الفصل، ستتعلم كيفية التعامل مع النصوص بشكل احترافي: تقسيمها، دمجها، البحث والاستبدال، تنظيفها، وتحليلها. ستكتشف الدوال المدمجة القوية في Python التي تجعل معالجة النصوص سهلة وفعالة.
Python توفر مجموعة كبيرة من الدوال المدمجة للعمل مع النصوص. لنبدأ بالأساسيات:
# النص الأساسي
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 (موضع بدء "عالم")
شرح الكود: - `len()` تعطيك عدد الأحرف في النص - `upper()` و `lower()` لتحويل الحالة - `[::-1]` لعكس النص (slicing بخطوة -1) - `find()` للبحث عن موضع كلمة (ترجع -1 إذا لم تجد)
# النص
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
شرح الكود: - `in` للتحقق من وجود نص داخل نص آخر - `startswith()` و `endswith()` للتحقق من البداية والنهاية - `count()` لعد عدد مرات كلمة أو حرف معين
من أهم العمليات في معالجة النصوص هي تقسيم النص إلى أجزاء ودمج الأجزاء مرة أخرى.
# النص
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
شرح الكود: - `split()` بدون معاملات يقسّم على أي مسافة بيضاء - `split(",")` يقسّم على فاصل محدد - `split("-", 2)` يقسّم على أول عدد معين من الفواصل - يمكنك استخدام unpacking لتوزيع النتائج على متغيرات
# قائمة من الكلمات
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
شرح الكود: - `join()` تدمج عناصر قائمة مع فاصل معين - أفضل طريقة من استخدام `+` في حلقة (أسرع وأنظف) - يمكن استخدام generator expression مع join لتحويل الأنواع
البحث والاستبدال من العمليات الشائعة جداً في معالجة النصوص.
# النص
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.
شرح الكود: - `replace(old, new)` يستبدل كل مرات القديم بالجديد - `replace(old, new, count)` يستبدل عدد معين من المرات - يمكن ربط عدة `replace()` معاً
# النص
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
شرح الكود: - `find()` ترجع -1 إذا لم تجد - `rfind()` تبحث من النهاية - `index()` ترفع استثناء إذا لم تجد - يمكن دمج البحث مع التعديل باستخدام enumerate
تنظيف النصوص من المسافات والأحرف الزائدة عملية مهمة جداً.
# النص مع مسافات زائدة
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()` تزيل كل المسافات الزائدة من الوسط
# النصوص
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
شرح الكود: - `upper()` يحول كل الأحرف إلى كبيرة - `lower()` يحول كل الأحرف إلى صغيرة - `capitalize()` يحول أول حرف فقط إلى كبير والباقي إلى صغير - `title()` يحول أول حرف من كل كلمة إلى كبير - `swapcase()` يعكس الحالة
Python توفر دوال للتحقق من نوع محتوى النص بسهولة.
# نصوص مختلفة
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
شرح الكود: - `isdigit()` للتحقق من أن كل الأحرف أرقام - `isalpha()` للتحقق من أن كل الأحرف حروف - `isalnum()` للتحقق من أن كل الأحرف حروف أو أرقام - `isspace()` للتحقق من أن كل الأحرف مسافات - `isupper()` و `islower()` للتحقق من الحالة
# قائمة رسائل بريد إلكترونية
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("---")
شرح الكود: - نظفنا المسافات بـ `strip()` - حولنا إلى أحرف صغيرة بـ `lower()` - تحققنا من وجود @ بـ `in` - فصلنا الاسم والنطاق بـ `split()`
# بيانات 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("---")