# النصوص في Python: split وreplace وstrip وjoin والشرائح وf-strings

URL: https://skillaria.top/ar/guides/python/strings-python

النص في Python (str) سلسلة من رموز Unicode، لذلك تعمل الحروف العربية والإيموجي دون إعداد. أهم طرقه: split تقسم النص إلى قائمة، وjoin تدمج قائمة في نص، وreplace تستبدل جزءاً منه، وstrip تحذف المسافات من الأطراف. النصوص غير قابلة للتعديل، فكل طريقة تعيد نصاً جديداً يجب حفظه، وتُعرض القيم بالتنسيق f-strings.

النصوص في Python تظهر في كل برنامج تقريباً: إدخال المستخدم، وأسماء الملفات، وأسطر CSV، وردود الـ API. النوع `str` يحفظ النص بترميز Unicode، لذلك تعمل الحروف العربية والإيموجي دون أي إعداد. أكثر طرقه استخداماً هي `split` و`replace` و`strip` و`join`، ولعرض القيم يكون التنسيق بـ f-strings الأسهل. وفيما يلي شرح لذلك بالأمثلة.

## كيف يعمل النص في Python

يُكتب النص بين علامات مفردة أو مزدوجة، ولا فرق بينهما: `'قهوة'` و`"قهوة"` متطابقان. والعلامات الثلاثية تنشئ نصاً متعدد الأسطر تُحفظ فيه أسطر الانتقال كما هي.

```
name = "قهوة"
note = """السطر الأول
السطر الثاني"""
print(len(name))  # 4 — طول النص بعدد الرموز
```

الخاصية الأهم للنصوص أنها غير قابلة للتعديل. الطريقة لا تغيّر النص، بل تعيد نصاً جديداً. لذلك لن يفيد `s.replace("a", "b")` إذا لم تحفظ النتيجة، وعليك كتابة `s = s.replace("a", "b")`. وهذا من أكثر الأخطاء شيوعاً عند المبتدئين.

### الرموز الخاصة وسطر الانتقال والنصوص الخام

سطر الانتقال يُكتب `\n`، والتاب `\t`، والشرطة المائلة العكسية `\\`. والبادئة `r` تجعل النص «خاماً»، فلا تُعالج الشرطات المائلة فيه، وهذا مفيد لمسارات Windows وللتعابير النمطية.

```
print("الإجمالي:\n350 ريال")
path = r"C:\new\table.csv"   # \n و\t لن تتحولا إلى رموز خاصة
```

يمكن تقسيم تعبير طويل على عدة أسطر بوضعه بين أقواس: تدمج Python النصوص المتجاورة داخل الأقواس تلقائياً.

## split: تقسيم النص إلى قائمة

تقسم الطريقة `split()` النص حسب فاصل وتعيد قائمة. دون معامل تقسم عند أي محارف مسافة، وتتجاهل المسافات المتكررة، وهذا مفيد لتحليل الأوامر.

```
"add  قهوة 250".split()        # ['add', 'قهوة', '250']
"2026-10-16".split("-")        # ['2026', '10', '16']
"a,b,,c".split(",")            # ['a', 'b', '', 'c']
"key=value=x".split("=", 1)    # ['key', 'value=x']
```

لاحظ الفرق: مع فاصل صريح تبقى الأجزاء الفارغة. والمعامل الثاني `maxsplit` يحدد عدد مرات التقسيم، والطريقة `rsplit()` تقسم من اليمين. ولتقسيم نص إلى أسطر استخدم `splitlines()`: تفهم `\n` و`\r\n` ولا تترك عنصراً فارغاً في النهاية.

```
text = "قهوة\nتاكسي\n"
text.split("\n")     # ['قهوة', 'تاكسي', '']
text.splitlines()    # ['قهوة', 'تاكسي']
```

## join: دمج القائمة في نص

`join()` هي العملية العكسية. تُستدعى على النص الفاصل، وتتلقى قائمة من النصوص:

```
items = ["قهوة", "تاكسي", "غداء"]
print(", ".join(items))   # قهوة, تاكسي, غداء
print("\n".join(items))   # كل بند في سطر
```

يجب أن تكون كل العناصر نصوصاً، وإلا ستحصل على `TypeError: sequence item 0: expected str instance, int found`. حوّل الأرقام أولاً: `", ".join(str(x) for x in amounts)`.

### الدمج والتسلسل

يمكن جمع نصين بالعامل `+`، وتكراره بالعامل `*`: `"-" * 20`. لكن دمج مئات الأجزاء في حلقة بـ `+=` بطيء، لأن كل مرة يُنشأ نص جديد. اجمع الأجزاء في قائمة ثم ادمجها بـ `join()` مرة واحدة. ولا يمكن جمع نص مع رقم مباشرة: `"الإجمالي: " + 5` تعطي `TypeError`، والحل دالة `str()` أو f-string.

## replace: استبدال جزء من النص

`replace(old, new)` تستبدل كل ظهورات الجزء. والمعامل الثالث يحدد عدد مرات الاستبدال.

```
price = "1 250,50"
price = price.replace(" ", "").replace(",", ".")
print(float(price))                  # 1250.5

"أ-ب-ج".replace("-", "+", 1)         # 'أ+ب-ج'
```

الطريقة حساسة لحالة الأحرف الإنجليزية، وتبحث عن تطابق تام. أما الاستبدال حسب نمط (مثلاً «كل الأرقام») فيحتاج إلى الوحدة `re` والدالة `re.sub()`.

## strip وlstrip وrstrip: تنظيف الأطراف

`strip()` تحذف المسافات والتابات وأسطر الانتقال من الطرفين. و`lstrip()` تنظف اليسار فقط، و`rstrip()` اليمين فقط. وهذا أول ما يُفعل بمدخلات المستخدم والأسطر القادمة من ملف.

```
raw = "  قهوة \n"
raw.strip()       # 'قهوة'
raw.rstrip()      # '  قهوة'
"xxقهوةxx".strip("x")   # 'قهوة'
```

المعامل يحدد مجموعة محارف، وليس نصاً كاملاً: `"abcنصcba".strip("abc")` تحذف كل a وb وc من الأطراف بأي ترتيب. ولحذف بادئة أو لاحقة بعينها استخدم `removeprefix()` و`removesuffix()` (منذ Python 3.9).

## طرق نصية أخرى مفيدة

| الطريقة | ماذا تفعل | مثال ← نتيجة |
| --- | --- | --- |

| `lower()`، `upper()` | حالة الأحرف | `"Coffee".lower()` ← `'coffee'` |

| `startswith()`، `endswith()` | فحص البداية والنهاية | `"a.csv".endswith(".csv")` ← `True` |

| `find()` | موضع النص أو -1 | `"قهوة".find("ه")` ← `2` |

| `count()` | عدد الظهورات | `"banana".count("a")` ← `3` |

| `isdigit()` | هل هو أرقام فقط؟ | `"250".isdigit()` ← `True` |

| `zfill()` | الإكمال بالأصفار | `"7".zfill(3)` ← `'007'` |

للتحقق من وجود نص داخل نص آخر أسهل طريقة هي العامل `in`: `if "قهوة" in text.lower():`. وتُقارن النصوص بـ `==` محرفاً بمحرف مع مراعاة حالة الأحرف؛ وللمقارنة دون مراعاتها حوّل الطرفين بـ `casefold()`.

## شرائح النص

النص متتالية، لذلك يمكن الوصول إلى محارفه بالفهرس ابتداءً من الصفر، والفهرس السالب يعد من النهاية. الشريحة `s[start:stop:step]` تعيد نصاً فرعياً، والحد الأيمن لا يُضمّن.

```
s = "Python"
s[0]      # 'P'
s[-1]     # 'n'
s[0:3]    # 'Pyt'
s[2:]     # 'thon'
s[::2]    # 'Pto'
s[::-1]   # 'nohtyP' — عكس النص
```

الشريحة لا تسبب خطأ عند تجاوز الحدود: `s[0:100]` تعيد النص كله. أما `s[100]` فتعطي `IndexError`. ولا يمكن تغيير محرف بفهرسه (`s[0] = "J"` تعطي `TypeError`)، والحل بناء نص جديد: `"J" + s[1:]`.

## f-strings في Python

الحرف `f` قبل النص يعني أن التعابير بين الأقواس المعقوفة ستُحسب وتُدرج في النص. وهي الطريقة الأساسية للتنسيق منذ Python 3.6: أقصر من `format()` وأسرع من العامل `%` القديم.

```
item = "قهوة"
price = 250
print(f"{item}: {price} ريال")               # قهوة: 250 ريال
print(f"بعد الخصم: {price * 0.9} ريال")     # بعد الخصم: 225.0 ريال
print(f"{item=}")                             # item='قهوة' — مفيد للتصحيح
```

### تنسيق الأرقام والمحاذاة

بعد النقطتين داخل الأقواس يُكتب مواصفة التنسيق، وهي تحدد التقريب وفواصل الخانات والعرض والمحاذاة:

| الكتابة | النتيجة | المعنى |
| --- | --- | --- |

| `f"{3.14159:.2f}"` | `3.14` | تقريب إلى منزلتين |

| `f"{1250000:,}"` | `1,250,000` | فاصل الخانات |

| `f"{1250000:_}"` | `1_250_000` | شرطة سفلية بدل الفاصلة |

| `f"{0.256:.1%}"` | `25.6%` | نسبة مئوية |

| `f"{'قهوة':<10}|"` | `قهوة |` | محاذاة لليسار، عرض 10 |

| `f"{250:>8}"` | ` 250` | محاذاة لليمين |

| `f"{7:03d}"` | `007` | إكمال بالأصفار |

المحاذاة مفيدة للجداول في الطرفية: `f"{name:<12}{amount:>10.2f}"` ترتب الأعمدة بدقة. وانتبه إلى أن التنسيق يُستخدم عند العرض فقط. احفظ المال بالهللات (`int`) أو بنوع `Decimal`، لا بـ `float`: فالعملية `0.1 + 0.2` تعطي `0.30000000000000004`.

### علامات الاقتباس وأسطر الانتقال داخل f-string

منذ Python 3.12 (PEP 701) صار للـ f-strings قواعد نحوية رسمية: داخل الأقواس المعقوفة يمكن استخدام علامات الاقتباس نفسها للنص الخارجي، والشرطات المائلة العكسية وأسطر الانتقال، ولم تعد هناك حدود للتداخل. وتُظهر الأخطاء داخل الأقواس موقعها بدقة. وعلى الإصدارات القديمة استخدم نوعاً آخر من علامات الاقتباس داخل الأقواس: `f"{d['key']}"`، ويكون سطر الانتقال عبر متغير منفصل أو `chr(10)`.

للنص متعدد الأسطر تناسب f-string بالعلامات الثلاثية: `f"""الإجمالي: {total}\nعدد البنود: {count}"""`.

### format() و%: الطرق القديمة

في الكود القديم ستجد `"{}: {}".format(item, price)` و`"%s: %d" % (item, price)`. مواصفات `format()` هي نفسها في f-strings. وتبقى الطريقة `format()` مفيدة عندما يُخزَّن القالب منفصلاً عن البيانات، مثل الإعدادات.

## تحليل النص: مثال عملي

لنجمع الطرق معاً. لنفترض أن الملف يحتوي على أسطر بالشكل `"  2026-10-16; قهوة ; 250,50 \n"`، والمطلوب استخراج التاريخ والاسم والمبلغ بالهللات. الترتيب المعتاد: تنظيف الأطراف، ثم التقسيم حسب الفاصل، ثم تنظيف كل جزء، ثم تحويل الأنواع.

```
line = "  2026-10-16; قهوة ; 250,50 \n"

date, item, raw_amount = [p.strip() for p in line.strip().split(";")]
amount_kop = round(float(raw_amount.replace(",", ".")) * 100)

print(date, item, amount_kop)            # 2026-10-16 قهوة 25050
print(f"{item:10.2f}")
```

إذا لم تكن الأجزاء ثلاثة، فسيفشل فك التعبئة بـ `ValueError: not enough values to unpack` أو `too many values to unpack`. وفي الكود الحقيقي تحقق من هذه الأسطر مسبقاً أو التقط الاستثناء. أما ملفات CSV الحقيقية التي فيها علامات اقتباس وترميز خاص فالأفضل معالجتها بالوحدة القياسية `csv` بدلاً من `split`.

### أخطاء شائعة مع النصوص

- **نتيجة الطريقة غير محفوظة**: `s.strip()` دون إسناد لا تغيّر شيئاً.
- **join على قائمة أرقام**: `TypeError`؛ استخدم `map(str, ...)` أولاً.
- **strip مع نص كامل**: المعامل مجموعة محارف، والبادئة تُحذف بـ `removeprefix()`.
- **مقارنة مع مراعاة الحالة**: `"Coffee" == "coffee"` تعطي `False`.
- **شرطات مائلة في مسارات Windows** دون البادئة `r` تتحول إلى رموز خاصة.

## t-strings: قالب بدل النص الجاهز

ظهرت في Python 3.14 t-strings. تشبه f-strings لكن بالبادئة `t`، والنتيجة مختلفة: ليست نصاً جاهزاً، بل كائن `string.templatelib.Template`. تُحفظ فيه أجزاء النص (`.strings`) والقيم المدرجة (`.values`) بشكل منفصل.

```
name = ""
tpl = t"مرحباً، {name}!"
print(tpl.strings)   # ('مرحباً، ', '!')
print(tpl.values)    # ('',)
```

الفائدة أن المكتبة تحصل على القيم قبل دمجها، فتستطيع معالجتها: مثلاً تهريب الأقواس الزاوية في HTML أو تمرير المعاملات بأمان إلى استعلام SQL. أما f-string فلا تترك هذه الفرصة، لأنها دمجت كل شيء. للعرض العادي تبقى f-strings هي الخيار.

## الخلاصة

للعمل اليومي مع النصوص في Python تكفي مجموعة صغيرة: تقوم `split()` و`join()` بتحليل النص وبنائه، وتنظف `strip()` المدخلات، وتستبدل `replace()` الأجزاء، وتقطع الشرائح النصوص الفرعية، وتعرض f-strings القيم بالتنسيق المطلوب. تذكّر أن النص غير قابل للتعديل: الطريقة تعيد نصاً جديداً، ويجب حفظه. وقد شُرحت النصوص والأرقام وf-strings عملياً في الدورة، من خلال متتبّع المصروفات.

## FAQ

**كيف أعرف طول نص في Python؟**

الدالة len(s) تعيد عدد المحارف. وفي العربية والإيموجي تُحسب المحارف وفق Unicode لا البايتات؛ وحجم النص بالبايتات يُعرف بـ len(s.encode("utf-8")).

**كيف أحوّل رقماً إلى نص والعكس؟**

str(250) تعطي '250'، و int("250") و float("2.5") تعكسان ذلك. إذا لم يكن النص رقماً فإن int() ترفع ValueError، لذلك تحقق من المدخلات.

**لماذا لا تغيّر replace النص؟**

النصوص غير قابلة للتعديل، وreplace تعيد نصاً جديداً. احفظ النتيجة: s = s.replace("a", "b").

**كيف أتحقق من أن النص فارغ؟**

النص الفارغ يُعامَل كقيمة خاطئة، فيكفي if not s:. وإذا كان النص قد يتكون من مسافات فقط فتحقق بـ if not s.strip():.

**ما الفرق بين t-string وf-string؟**

f-string تعيد نص str جاهزاً فوراً، أما t-string (منذ Python 3.14) فتعيد كائن Template فيه أجزاء النص والقيم منفصلة، وهذا يسمح بتهريب البيانات بأمان لـ HTML وSQL.


---
Source: Skillaria.Top (https://skillaria.top)
