النصوص في بايثون مع دوال جاهزة
السلاسل النصية في بايثون هي ببساطة سلسلة من الحروف، وستتعامل معها أكثر من أي نوع آخر من البيانات. فكل اسم، وعنوان، ورسالة، ورابط URL، ومسار ملف، وحتى الاستجابات القادمة من الـ API، كلها في النهاية نصوص.
لإنشاء سلسلة نصية، ضعها بين علامات اقتباس — مفردة، أو مزدوجة، أو ثلاثية:
علامات الاقتباس المفردة والمزدوجة متبادلة، فاستخدم ما يجنّبك تهريب الأحرف. مثلاً "don't" تبدو نظيفة، بينما 'don\'t' تحتاج إلى شرطة مائلة عكسية.
السلاسل النصية في بايثون غير قابلة للتعديل (immutable). بمجرد إنشاء السلسلة، لا يمكنك تغيير أي حرف فيها مباشرةً. كل عملية تبدو وكأنها تعدّل السلسلة هي في الحقيقة تُرجع سلسلة جديدة. لهذا السبب ستكتب text = text.upper() بدلاً من text.upper() فقط — فبدون إعادة الإسناد، ستضيع السلسلة الجديدة التي كُتبت بأحرف كبيرة.
دمج النصوص في بايثون وتكرارها
هناك معاملان يقومان بمعظم عمليات دمج النصوص التي ستحتاجها:
+ يقوم بدمج النصوص، و * يُكرّر السلسلة النصية. كلا العمليتين تُرجع سلسلة جديدة.
لكن دمج النصوص في بايثون باستخدام + يصبح فوضوياً بسرعة، خصوصاً عند خلط قيم من أنواع مختلفة داخل رسالة واحدة. في هذه الحالة، الحل الأفضل هو استخدام f-strings كما سنرى في القسم التالي.
f-string بايثون: الطريقة الأكثر استخداماً للتنسيق
ضع حرف f قبل علامة الاقتباس الافتتاحية، وستتحول السلسلة إلى قالب جاهز. أي تعبير تضعه بين {...} سيُستبدل بقيمته مباشرة:
يمكنك وضع أي تعبير داخل الأقواس المعقوفة — متغيرات، عمليات حسابية، استدعاء توابع، أو استدعاء دوال. لكن احرص أن تبقى بسيطة؛ فإذا وجدت نفسك تحاول حشر عملية حسابية من ثلاثة أسطر داخل {...}، فالأفضل حسابها أولاً في متغير باسم واضح ثم استخدامه.
كما تدعم f-string في بايثون محددات التنسيق بعد النقطتين :، وذلك للتحكم في تنسيق الأرقام والحشو والمحاذاة:
مواصفات التنسيق هذه هي نفسها التي يعتمدها str.format()، ويستحق إلقاء نظرة سريعة عليها بعد أن تتقن الأساسيات. لست بحاجة إليها في أول يوم من كتابة الكود.
التقطيع (Slicing): اختر جزءًا من النص
السلاسل النصية في بايثون قابلة للفهرسة مثل أي تسلسل آخر. كل حرف له موقع يبدأ من الصفر، ويمكنك انتقاء حرف واحد أو نطاق كامل من الأحرف:
النمط [start:stop:step] تلاقيه في القوائم وباقي التسلسلات كمان، فخلّيك تعطيه بضع دقائق من وقتك عشان تفهمه كويس، راح توفّر عليك كتير لاحقاً.
في نقطتين لازم ننتبه لهم:
- المؤشر
stopمستثنى من النتيجة:word[0:2]يرجّع الحرفين اللي مؤشراتهم 0 و 1، مش 2. - المؤشرات السالبة تبدأ العدّ من النهاية:
-1هو آخر حرف، و-2الحرف اللي قبله، وهكذا.
عكس نص بايثون بخطوة واحدة
السلاسل النصية في بايثون ما عندها دالة .reverse() لأنها غير قابلة للتعديل (immutable)، لكن التقطيع (slicing) مع خطوة -1 يخلّص المهمة بسطر واحد:
word[::-1] تعني: "من البداية إلى النهاية، بخطوة عكسية مقدارها 1". الناتج سلسلة نصية جديدة تمامًا، أما الأصلية فتبقى كما هي دون أي تغيير. وإذا أردت المرور على الأحرف بترتيب معكوس دون إنشاء سلسلة جديدة في الذاكرة، فاستخدم reversed(word) التي تُرجع مُكرِّرًا كسولًا (lazy iterator).
كيفية معرفة طول السلسلة في بايثون
الدالة len(text) تُرجع عدد الأحرف داخل النص:
لاحظ أن len تحسب نقاط يونيكود (code points) وليس البايتات. فمثلاً len("café") تساوي 4 وليس 5، رغم أن ترميز UTF-8 يستهلك عدداً أكبر من البايتات — وهذا هو السلوك المطلوب في أغلب الحالات.
كيفية التحقق من احتواء نص على كلمة معينة في بايثون
المعامل in هو الطريقة المثالية لهذا الغرض، وقراءته تبدو وكأنها جملة إنجليزية عادية:
للمقارنات التي لا تُفرّق بين الأحرف الكبيرة والصغيرة، وحِّد الطرفين أولًا:
إذا كنت تحتاج إلى موقع النص الفرعي وليس مجرد إجابة بنعم أو لا، استخدم .find() — فهي تُرجع رقم الفهرس، أو -1 إذا لم يكن النص الفرعي موجودًا.
أشهر دوال السلاسل النصية في بايثون
السلاسل النصية في بايثون تمتلك عشرات الدوال، لكن هذه المجموعة هي التي ستستخدمها بشكل شبه يومي:
التقسيم والدمج:
.split(separator) يحوّل السلسلة النصية إلى قائمة، و separator.join(list_of_strings) يعيد لصقها من جديد. هاتان الدالتان تتولّيان نصيبًا كبيرًا من معالجة النصوص في المشاريع الحقيقية.
وإليك ثنائيًا مفيدًا آخر:
هذا محلل بسيط لسطر واحد من ملف إعدادات، مكتوب في ثلاثة أسطر فقط. نصوص صغيرة، لكن قوّتها كبيرة.
كيف تتحقق من محتوى السلسلة النصية
هناك عدة دوال تُرجع قيمة منطقية (True أو False)، وهي مفيدة داخل جمل if:
استخدمها باعتدال — فهي لا تتعامل مع خصوصيات Unicode بالشكل الذي قد تتوقعه دائمًا. إذا كنت تعمل مع نصوص خارج نطاق ASCII، فالأفضل الاعتماد على وحدة regex أو وحدة unicodedata.
تهريب الرموز الخاصة في السلاسل النصية
بعض الرموز تحتاج إلى خط مائل عكسي (\) حتى تظهر داخل السلسلة النصية:
إذا كنت تتعامل مع مسارات ويندوز أو التعابير النمطية (regex)، فإن السلاسل النصية الخام (raw strings) توفّر عليك الكثير من الصداع. ضع حرف r قبل علامة الاقتباس، وستتوقف الشرطة المائلة العكسية عن العمل كرمز هروب:
النصوص في كل مكان، فلتُبقِها قابلة للقراءة
ثلاث عادات تمنع الكود المليء بالسلاسل النصية في بايثون من التحوّل إلى فوضى:
- استخدم f-string للدمج بين القيم. لا تُسلسِل أنواعًا مختلفة باستخدام
+. - أعِد الإسناد عند "التعديل". اكتب
text = text.strip()بدلًا منtext.strip()وحدها. - اعتمد على
.split()و.join()قبل أن تكتب حلقات يدوية لتقسيم النصوص أو تجميعها. فهي أسرع وأوضح، والخطأ فيها أصعب.
في الدرس التالي: شرح موسّع لـ f-string في بايثون — أداة التنسيق التي مرّت عليك بضع مرات بالفعل، إلى جانب مواصفات تنسيق الأرقام والتواريخ التي تستحق الإتقان.
الأسئلة الشائعة
ما هي الـ f-string في بايثون؟
الـ f-string هي سلسلة نصية يُكتب قبلها الحرف f، وأي شيء تضعه بين {...} داخلها يُستبدل تلقائياً بقيمة التعبير البرمجي. مثال: f"Hello, {name}!" يضع قيمة المتغير name الحالية داخل النص أثناء التشغيل.
كيف أعكس نصاً في بايثون؟
استخدم التقطيع (slicing) بخطوة -1 هكذا: reversed_text = original[::-1]. هذا يُرجع سلسلة جديدة تحتوي على نفس الحروف لكن بترتيب معكوس. السلسلة الأصلية تبقى كما هي لأن السلاسل في بايثون غير قابلة للتعديل (immutable).
كيف أقسّم سلسلة نصية في بايثون؟
استدعِ الدالة .split() على السلسلة. بدون أي معامل، تُقسّم عند أي فراغ: "a b c".split() تُرجع ['a', 'b', 'c']. ويمكنك تمرير فاصل محدد: "a,b,c".split(",") تُرجع ['a', 'b', 'c'].
هل السلاسل النصية في بايثون قابلة للتعديل؟
لا، السلاسل في بايثون غير قابلة للتعديل (immutable) — بمجرد إنشاء السلسلة لا يمكنك تغيير أي حرف فيها مباشرة. كل دالة تبدو وكأنها "تعدّل" السلسلة هي في الحقيقة تُرجع سلسلة جديدة. لهذا ترى دائماً نمطاً مثل text = text.strip() حيث نعيد إسناد النتيجة إلى نفس المتغير.
كيف أدمج سلسلتين نصيتين في بايثون؟
استخدم العلامة + لدمج سلسلتين: "hello" + " " + "world". ولإدخال قيمة متغير داخل جملة، يُفضَّل استخدام f-string هكذا: f"Hello, {name}". أما إذا أردت دمج عناصر كثيرة من قائمة، فاستخدم separator.join(pieces) — فهي أسرع وأوضح من سلسلة + متتالية.
كيف أعرف طول سلسلة نصية في بايثون؟
استخدم الدالة المدمجة len(text)، وهي تُرجع عدد الحروف (Unicode code points)، لذا فإن len("café") يساوي 4. إذا أردت الطول بالبايت، حوّل السلسلة أولاً: len(text.encode("utf-8")).