أساسيات السلاسل النصية

أكثر أنواع البيانات التي ستعمل معها ليست الأرقام — إنه النص. أسماء المستخدمين، رسائل البريد الإلكتروني، المقالات، بيانات JSON، HTML... كلها سلاسل نصية. هذا الدرس يغطي عمليات السلاسل النصية في بايثون بشكل منهجي.


1. ثلاثة أنواع من علامات الاقتباس

تسمح بايثون بثلاث طرق لتعريف السلاسل النصية:

PYTHON
# علامات اقتباس مفردة
s1 = 'Hello'

# علامات اقتباس مزدوجة
s2 = "Hello"

# علامات اقتباس ثلاثية (سلاسل متعددة الأسطر)
s3 = """This is the first line
This is the second line
This is the third line"""

علامات الاقتباس المفردة والمزدوجة متكافئة — اختر واحدة والتزم بها:

PYTHON
# هاتان متكافئتان
name = 'Xiao Ming'
name = "Xiao Ming"

لكن إذا كانت سلسلتك النصية تحتوي على علامات اقتباس، ستحتاج إلى المزج:

PYTHON
# السلسلة بها علامات اقتباس مفردة، استخدم المزدوجة
text = "It's a beautiful day"
print(text)              # It's a beautiful day

# السلسلة بها علامات اقتباس مزدوجة، استخدم المفردة
text = 'He said: "Hello!"'
print(text)              # He said: "Hello!"

# أو استخدم حرف هروب (غير موصى به، يضر بقابلية القراءة)
text = 'It\'s a beautiful day'
💡 نصيحة: يُوصى باستخدام علامات الاقتباس المزدوجة باستمرار. النص الإنجليزي غالباً ما يحتوي على فواصل عليا (don't, it's) — مع علامات الاقتباس المفردة ستحتاج إلى هروبها. علامات الاقتباس المزدوجة تتجنب هذه المشكلة.

علامات الاقتباس الثلاثية: رائعة للنص متعدد الأسطر

علامات الاقتباس الثلاثية (""" أو ''') تحافظ على فواصل الأسطر والتنسيق:

PYTHON
# نص متعدد الأسطر بعلامات اقتباس ثلاثية
message = """Dear Customer,

Thank you for choosing our service. Your order has been confirmed.
Estimated delivery: 3 business days.

If you have any questions, please contact support.
Have a nice day!"""

print(message)

المخرجات:

TEXT
Dear Customer,

Thank you for choosing our service. Your order has been confirmed.
Estimated delivery: 3 business days.

If you have any questions, please contact support.
Have a nice day!

علامات الاقتباس الثلاثية شائعة الاستخدام لـ: النص الطويل، سلاسل التوثيق، وأوصاف الدوال.


2. أحرف الهروب

بعض الأحرف لا يمكن كتابتها مباشرة في سلسلة نصية (مثل الأسطر الجديدة وعلامات التبويب أو علامات الاقتباس نفسها). استخدم أحرف الهروب — شرطة مائلة عكسية \ متبوعة بحرف.

الهروب المعنى
\n سطر جديد
\t علامة تبويب
\\ الشرطة المائلة العكسية نفسها
\' علامة اقتباس مفردة
\" علامة اقتباس مزدوجة
PYTHON
print("First line\nSecond line")           # \n سطر جديد
print("Name:\tZhang San\tAge:\t25")        # \t محاذاة بعلامة تبويب
print("C:\\Users\\XiaoMing\\Desktop")      # \\ يُخرج شرطة مائلة عكسية
print("He said: \"Hello!\"")               # \" علامة اقتباس مزدوجة

المخرجات:

TEXT
First line
Second line
Name:	Zhang San	Age:	25
C:\Users\XiaoMing\Desktop
He said: "Hello!"

مثال: تنسيق جدول بأحرف الهروب (الصعوبة ⭐)

PYTHON
# استخدم \t لمحاذاة جدول
print("Item\tPrice\tQty\tTotal")
print("------------------------")
print("Apple\t5.0\t3\t15.0")
print("Banana\t3.5\t5\t17.5")
print("Milk\t12.0\t2\t24.0")
▶ جرّب الكود

المخرجات:

TEXT
Item	Price	Qty	Total
------------------------
Apple	5.0	3	15.0
Banana	3.5	5	17.5
Milk	12.0	2	24.0
💡 نصيحة: \t مفيد لمحاذاة النص، لكن إذا اختلفت أطوال المحتوى، قد لا تكون المحاذاة مثالية. للإنتاج، استخدم تنسيق f-string ({value:10} لاحتلال عرض 10 أحرف).


3. السلاسل النصية الخام

إذا سبق لك كتابة مسارات ملفات ويندوز، فقد واجهت هذه المشكلة:

PYTHON
# عذراً! \n يُفسر كسطر جديد
path = "C:\Users\new_folder\documents"
print(path)
# يُخرج: C:\Users
#        ew_folder\documents

الحل: أسبق السلسلة بـ r، لتخبر بايثون "لا تعالج أحرف الهروب، أخرج كما هو":

PYTHON
# ✅ سلسلة خام — بادئة r
path = r"C:\Users\new_folder\documents"
print(path)
# يُخرج: C:\Users\new_folder\documents

في سلسلة خام، كل حرف هو نفسه — \n لم يعد يعني سطراً جديداً، \t لم يعد يعني علامة تبويب.

PYTHON
# أنماط التعبير العادي (سنستخدم هذا لاحقاً)
pattern = r"\d{3}-\d{8}"   # تطابق أرقام الهواتف: 010-12345678

# مسارات الملفات
log_path = r"D:\logs\app\2026\06\error.log"

print(f"Log path: {log_path}")
⚠️ ملاحظة: آخر حرف في سلسلة خام لا يمكن أن يكون شرطة مائلة عكسية — r"abc\" سيُسبب خطأ. لماذا؟ على الرغم من أن \" لا يُعالج كهروب، المحلل يرى الشرطة المائلة كهروب لعلامة الاقتباس الختامية، مما يسبب سلسلة غير منتهية.


4. فهرسة السلاسل النصية

السلسلة النصية هي تسلسل من الأحرف، لكل منها موضع (فهرس). فهارس بايثون تبدأ من 0:

PYTHON
text = "Python"
# الفهرس: 0→P  1→y  2→t  3→h  4→o  5→n

print(text[0])    # P
print(text[1])    # y
print(text[5])    # n

تدعم بايثون أيضاً الفهرسة السالبة، العد من اليمين إلى اليسار. -1 هو آخر حرف:

PYTHON
text = "Python"
print(text[-1])   # n (الأخير)
print(text[-2])   # o (قبل الأخير)
print(text[-3])   # h
print(text[-6])   # P (الأول)

رسم بياني للفهارس

TEXT
موجب:  0    1    2    3    4    5
       ┌────┬────┬────┬────┬────┬────┐
       │ P  │ y  │ t  │ h  │ o  │ n  │
       └────┴────┴────┴────┴────┴────┘
سالب: -6   -5   -4   -3   -2   -1

مثال: استخراج معلومات من رقم هوية (الصعوبة ⭐)

PYTHON
# استخرج المعلومات الأساسية من رقم الهوية
id_number = "110101199001011234"

# أول 6 أرقام: رمز المنطقة
address_code = id_number[:6]      # سنغطي التقطيع لاحقاً
print(f"Region code: {address_code}")

# الأرقام 7-14: تاريخ الميلاد
birth = id_number[6:14]
year = birth[:4]
month = birth[4:6]
day = birth[6:8]
print(f"Date of birth: {year}-{month}-{day}")

# آخر رقم (-1): المجموع الاختباري
last_digit = id_number[-1]
print(f"Checksum: {last_digit}")
▶ جرّب الكود

المخرجات:

TEXT
Region code: 110101
Date of birth: 1990-01-01
Checksum: 4
💡 نصيحة: string[6:14] يُسمى التقطيع — سنغطيه لاحقاً.


5. تقطيع السلاسل النصية

التقطيع يستخرج سلسلة فرعية من سلسلة. الصيغة: string[start:end:step]

PYTHON
text = "Hello, Python!"

# تقطيع أساسي: start:end (end غير شامل)
print(text[0:5])      # Hello (الأحرف 0 إلى 4)
print(text[7:13])     # Python

اختصارات

PYTHON
text = "Hello, Python!"

print(text[:5])       # Hello — احذف start، من البداية إلى الفهرس 5
print(text[7:])       # Python! — احذف end، من الفهرس 7 إلى النهاية
print(text[:])        # Hello, Python! — كل شيء

الخطوة

PYTHON
text = "Hello, Python!"

print(text[::2])      # Hlo yhn! — كل حرف ثاني
print(text[1::2])     # el,Pto — ابدأ من 1، كل ثاني

خطوة سالبة (العكس)

PYTHON
text = "Hello, Python!"

print(text[::-1])     # !nohtyP ,olleH — عكس السلسلة بأكملها!
print(text[5:0:-1])   # ,olle — من الفهرس 5 إلى 0، اتجاه عكسي

أمثلة التقطيع

PYTHON
# حيل تقطيع عملية
url = "https://www.example.com"

# أزل بادئة البروتوكول
without_https = url[8:]    # www.example.com
print(without_https)

# احصل على النطاق
domain = url[8:-4]         # www.example
print(domain)

# عكس سلسلة
name = "racecar"
reversed_name = name[::-1]   # racecar (متناظر)
print(name == reversed_name)  # True — إنه متناظر!

# كل حرف آخر
code = "H1e2l3l4o5"
clean = code[::2]           # Hello
print(clean)

المخرجات:

TEXT
www.example.com
www.example
True
Hello
💡 نصيحة: [::-1] هي الطريقة البايثونية الكلاسيكية لعكس سلسلة — بسيطة وأنيقة. لاحظ أن التقطيع لا يُثير أبداً IndexError — حتى لو تجاوزت start أو end طول السلسلة، تُرجع بايثون بأمان ما يمكنها.


6. طرق السلاسل النصية الشائعة

السلاسل النصية لديها العديد من الطرق المدمجة. سنغطي أكثرها شيوعاً هنا. لا حاجة لحفظ كل شيء — معرفة ما هو متاح كافٍ؛ ستحفظ مع الممارسة.

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

PYTHON
text = "Hello, Python!"

print(text.upper())         # HELLO, PYTHON!
print(text.lower())         # hello, python!
print(text.title())         # Hello, Python!
print(text.capitalize())    # Hello, python!

إزالة المسافات البيضاء

PYTHON
text = "   Hello, World!   "

print(f"|{text}|")                # |   Hello, World!   |
print(f"|{text.strip()}|")        # |Hello, World!| — كلا الجانبين
print(f"|{text.lstrip()}|")       # |Hello, World!   | — اليسار فقط
print(f"|{text.rstrip()}|")       # |   Hello, World!| — اليمين فقط

البحث والاستبدال

PYTHON
text = "Hello, Python! Python is fun!"

print(text.find("Python"))      # 7 — موضع أول ظهور
print(text.find("Java"))        # -1 — غير موجود، يُرجع -1
print(text.count("Python"))     # 2 — عدد مرات الظهور

new_text = text.replace("Python", "Java")
print(new_text)                  # Hello, Java! Java is fun!

# replace يمكنه تحديد أقصى عدد من الاستبدالات
partial = text.replace("Python", "Java", 1)
print(partial)                   # Hello, Java! Python is fun!

طرق الفحص

PYTHON
print("hello".isalpha())        # True — كلها أحرف
print("hello123".isalpha())     # False — بها أرقام
print("12345".isdigit())        # True — كلها أرقام
print("hello123".isalnum())     # True — أحرف وأرقام
print("hello!".isalnum())       # False — بها علامة تعجب
print("   ".isspace())          # True — كلها مسافات
💡 نصيحة: طرق الفحص هذه مفيدة جداً للتحقق من صحة الإدخال. مثلاً، التحقق مما إذا كان إدخال المستخدم كلها أرقام: if user_input.isdigit(): يضمن أن تحويل int() لن يفشل.

التقسيم والضم

PYTHON
# split(): سلسلة ← قائمة
sentence = "I love Python"
words = sentence.split()
print(words)                     # ['I', 'love', 'Python']

# حدد المحدد
csv_line = "Zhang San,25,Beijing"
fields = csv_line.split(",")
print(fields)                    # ['Zhang San', '25', 'Beijing']

# join(): قائمة ← سلسلة
parts = ["2026", "06", "23"]
date = "-".join(parts)
print(date)                      # 2026-06-23

مثال: تنظيف البيانات (الصعوبة ⭐⭐)

PYTHON
# محاكاة إدخال مستخدم غير نظيف
raw_data = "   Zhang San  ,  25  ,  Beijing  \n"

# عملية التنظيف
# 1. strip() يزيل المسافات البادئة واللاحقة
cleaned = raw_data.strip()
print(f"Step 1: |{cleaned}|")

# 2. split() بفاصلة
fields = cleaned.split(",")
print(f"Step 2: {fields}")

# 3. أزل المسافات الإضافية من كل حقل
name = fields[0].strip()
age = fields[1].strip()
city = fields[2].strip()

print(f"Name: {name}")
print(f"Age: {age}")
print(f"City: {city}")
▶ جرّب الكود

المخرجات:

TEXT
Step 1: |Zhang San  ,  25  ,  Beijing|
Step 2: ['Zhang San  ', '  25  ', '  Beijing']
Name: Zhang San
Age: 25
City: Beijing

7. len(): الحصول على طول السلسلة النصية

len() هي دالة بايثون مدمجة تُرجع طول سلسلة نصية (أو تسلسلات أخرى):

PYTHON
text = "Hello, Python!"
print(len(text))              # 15

# الأحرف الصينية كل منها يُحسب كـ 1
chinese = "你好世界"
print(len(chinese))           # 4

# السلسلة الفارغة طولها 0
print(len(""))                # 0

# استخدام شائع: تحديد طول الإدخال
username = "Xiao Ming"
if len(username) < 2:
    print("Username too short")
elif len(username) > 10:
    print("Username too long")
else:
    print(f"Username '{username}' is valid")
💡 نصيحة: في بايثون 3، طول السلسلة النصية يحسب الأحرف، وليس البايتات. len("中") يُرجع 1، وليس 3 (كان سيعيد 3 في بايثون 2). هذا يجعل عمليات السلاسل النصية أكثر بديهية.


حالات الاستخدام الشائعة


❓ أسئلة شائعة

س علامات الاقتباس المفردة مقابل المزدوجة — أيهما يجب استخدامي؟ لماذا تسمح بايثون بكلاهما؟
ج تاريخياً، آمن مصممو بايثون بإعطاء المبرمجين خياراً. مبرمجو C/Java يميلون لاستخدام علامات الاقتباس المزدوجة؛ مبرمجو JavaScript يستخدمون كليهما. يُوصى باستخدام علامات الاقتباس المزدوجة باستمرار، لأن الإنجليزية غالباً ما تحتوي على فواصل عليا (it's, don't, can't)، لذا علامات الاقتباس المزدوجة تتجنب الهروب. الأهم من ذلك، كن متسقاً داخل المشروع — لا تخلط بينهما. ⚠️ س:لماذا فهرس النهاية غير شامل؟ مثل text[0:5] لا يشمل الفهرس 5؟ ج:هذه فلسفة تصميم بايثون — الفترات نصف المفتوحة [start, end). ميزتان: 1) text[:5] سهل التذكر (أول 5 أحرف)؛ 2) text[0:5] و text[5:10] يتصلان بسلاسة بدون تداخل أو فجوات. ستقدر هذا التصميم بمجرد أن تعتاد عليه. س:ما الفرق بين find() و index()؟ ج:يفعلان نفس الشيء — البحث عن موضع سلسلة فرعية. الفرق: find() يُرجع -1 عندما لا يجد؛ index() يُثير خطأ (ValueError). استخدم find() للأمان في العمل اليومي. استخدم index() عندما تكون متأكداً من وجود السلسلة الفرعية (مثل الاستخراج من بيانات ذات تنسيق ثابت). س:لماذا لا تعدل طرق السلاسل النصية السلسلة الأصلية؟ (مثل text.upper() لا يغير text) ج:لأن السلاسل النصية في بايثون غير قابلة للتعديل. بمجرد إنشائها، لا يمكن تعديلها. text.upper() في الواقع يُرجع سلسلة جديدة؛ text الأصلي يبقى كما هو. هذا يضمن سلامة البيانات — عندما تمرر سلسلة إلى دالة، يمكنك التأكد من أنها لن تُعدّل سراً. "لتعديل" سلسلة، أنشئ واحدة جديدة من خلال التقطيع والدمج.

📖 ملخص

  • السلاسل النصية لها ثلاثة أشكال من علامات الاقتباس: مفردة، مزدوجة، ثلاثية؛ يُوصى باستخدام المزدوجة
  • أحرف الهروب \n, \t, \\، إلخ، تمثل أحرفاً خاصة
  • السلاسل الخام r"..." تمنع هروب الشرطة المائلة العكسية، رائعة للمسارات والتعبيرات العادية
  • الفهرسة تبدأ من 0، تدعم الفهرسة السالبة (-1 هو آخر حرف)
  • التقطيع [start:end:step] يستخرج سلاسل فرعية؛ end غير شامل؛ الخطوة السالبة تعكس
  • الطرق الشائعة: strip()، split()، join()، find()، replace()
  • طرق الفحص: isdigit()، isalpha()، isalnum()، إلخ، للتحقق من صحة الإدخال
  • السلاسل النصية غير قابلة للتعديل — كل "التعديلات" تُنشئ سلاسل جديدة

📝 تمارين

  1. أساسي (الصعوبة ⭐): بالنظر إلى s = "Python programming is fun!"، قم بما يلي:

    • استخرج أول 6 أحرف
    • استخرج آخر 4 أحرف
    • عكس السلسلة بأكملها
    • حوّل جميع الأحرف إلى أحرف كبيرة
  2. متوسط (الصعوبة ⭐⭐): اكتب مدقق بريد إلكتروني. بالنظر إلى email = "user@example.com"، تحقق مما إذا:

    • يحتوي على @
    • هناك محتوى على جانبي @ (لا جانب فارغ)
    • ينتهي بـ .com أو .cn أو .org
    • أخرج كل نتيجة فحص (True/False) تلميح: استخدم find() لتحديد موقع @، والتقطيع للتحقق من كلا الجانبين.
  3. تحدي (الصعوبة ⭐⭐⭐): اكتب منظف بيانات. بالنظر إلى:

    TEXT
    data = "   Zhang San, 25 ,  Beijing  ;  Li Si  ,  30,  Shanghai  ;  Wang Wu  ,  22,  Guangzhou  "
    

    قسّم بـ ; للحصول على بيانات كل شخص، ثم قسّم بـ , للحصول على كل حقل. استخدم strip() لتنظيف كل حقل، ثم أخرج جدولاً محاذياً بدقة.

100%