البرمجة

فهرسة وتقسيم السلاسل النصية في بايثون

جدول المحتوى

آلية فهرسة السلاسل النصية وطريقة تقسيمها في بايثون 3

تُعد السلاسل النصية (Strings) من البنى الأساسية في لغة البرمجة بايثون (Python 3)، وهي تُستخدم لتمثيل النصوص والتعامل معها بمرونة كبيرة. السلاسل النصية في بايثون تُعامل ككائنات قابلة للفهرسة (Indexable)، مما يعني إمكانية الوصول إلى أحرفها باستخدام مواضع محددة، كما يمكن تقسيمها بسهولة باستخدام تقنيات تُعرف بالتقسيم (Slicing). يمثل الفهم الجيد لهذه الآليات عنصرًا حيويًا في كتابة برمجيات تتعامل مع البيانات النصية بشكل فعّال واحترافي، لا سيما في مجالات مثل تحليل البيانات، معالجة اللغة الطبيعية، وتطوير تطبيقات الويب.

هذا المقال الموسّع يهدف إلى تقديم شرح شامل لمفاهيم الفهرسة والتقسيم في السلاسل النصية باستخدام بايثون 3، مدعومًا بالأمثلة العملية والتفصيلات الدقيقة المتعلقة بالآلية الداخلية لهذه العمليات.


مفهوم السلاسل النصية في بايثون

السلسلة النصية في بايثون هي تسلسل من الأحرف (characters) تُكتب داخل علامات اقتباس مفردة ' ', أو مزدوجة " "، ويمكن أن تحتوي على رموز، أرقام، حروف، أو مسافات. على سبيل المثال:

python
text = "Python is powerful"

في هذا المثال، تحتوي السلسلة text على 19 حرفًا (بما في ذلك المسافات).


الفهرسة (Indexing) في بايثون

تعريف الفهرسة

الفهرسة هي عملية الوصول إلى عنصر معين ضمن سلسلة نصية باستخدام رقم الموضع (Index) الخاص به. تبدأ الفهرسة في بايثون من الصفر (0)، أي أن أول حرف له الفهرس 0، والثاني 1، وهكذا.

الفهرسة الإيجابية

python
word = "Programming" print(word[0]) # P print(word[3]) # g

الفهرسة السلبية

توفر بايثون أيضًا ما يُعرف بـ الفهرسة السلبية، حيث يُمكن الوصول إلى عناصر السلسلة من نهايتها. الفهرس -1 يشير إلى الحرف الأخير، -2 إلى قبل الأخير، وهكذا.

python
word = "Programming" print(word[-1]) # g print(word[-3]) # n

حدود الفهرسة

في حالة محاولة الوصول إلى فهرس غير موجود، فسيتم رفع خطأ من نوع IndexError:

python
word = "Hi" print(word[5]) # IndexError: string index out of range

تقسيم السلاسل النصية (Slicing)

مفهوم التقسيم

التقسيم (Slicing) هو طريقة لاستخلاص جزء من سلسلة نصية باستخدام صيغة string[start:end:step]. ويعني هذا أخذ جزء يبدأ من الموضع start إلى الموضع end (دون تضمينه)، بخطوة step بين كل عنصر وآخر.

أبسط صيغة للتقسيم

python
text = "Hello, World" print(text[0:5]) # Hello

في هذا المثال، تم استخلاص أول خمسة أحرف من السلسلة.

استخدام القيم الافتراضية

  • إذا تم حذف start، فسيتم البدء من أول السلسلة.

  • إذا تم حذف end، فسيستمر حتى نهاية السلسلة.

  • إذا تم حذف step، فسيُعتبر الخطوة 1.

python
print(text[:5]) # Hello print(text[7:]) # World print(text[:]) # Hello, World

استخدام الخطوة (step)

python
text = "abcdef" print(text[::2]) # ace print(text[::-1]) # fedcba (عكس السلسلة)

التقسيم بالفهرسة السلبية

python
text = "DataScience" print(text[-5:-1]) # cien

الفرق بين الفهرسة والتقسيم

خاصية الفهرسة (Indexing) التقسيم (Slicing)
نوع القيمة المرجعة حرف مفرد سلسلة فرعية
صيغة الاستخدام string[index] string[start:end:step]
إمكانية استخدام الخطوة لا نعم
الناتج عند الخطأ IndexError سلسلة فارغة أو IndexError (نادرًا)

تطبيقات عملية للفهرسة والتقسيم

استخراج اسم من بريد إلكتروني

python
email = "[email protected]" username = email[:email.index('@')] print(username) # user123

الحصول على الامتداد من مسار ملف

python
filename = "report2025.pdf" extension = filename[filename.index('.')+1:] print(extension) # pdf

حذف الفراغات الزائدة في بداية السلسلة

python
raw = " Hello Python " cleaned = raw.strip() print(cleaned) # Hello Python

استخراج الحروف الفردية فقط

python
text = "abcdefgh" print(text[::2]) # aceg

السلاسل النصية ككائنات غير قابلة للتغيير (Immutable)

من الجوانب المهمة التي يجب إدراكها في بايثون أن السلاسل النصية غير قابلة للتغيير (Immutable)، أي أنه لا يمكن تعديل حرف ضمن السلسلة بشكل مباشر. بل يجب إنشاء سلسلة جديدة:

python
s = "Python" # s[0] = "J" # سيؤدي إلى TypeError s = "J" + s[1:] print(s) # Jython

أمثلة متقدمة

عكس كل كلمة في جملة مع الحفاظ على ترتيب الكلمات

python
sentence = "Python is fun" reversed_words = ' '.join([word[::-1] for word in sentence.split()]) print(reversed_words) # nohtyP si nuf

التحقق من كون السلسلة Palindrome (متماثلة عند العكس)

python
word = "madam" if word == word[::-1]: print("Palindrome") else: print("Not Palindrome")

التعامل مع Unicode في الفهرسة والتقسيم

بايثون 3 تدعم ترميز Unicode بشكل افتراضي، مما يسمح بالتعامل مع نصوص متعددة اللغات:

python
text = "مرحبا" print(text[0]) # م print(text[::-1]) # ابحرم

حتى الرموز التعبيرية (Emoji) تُعامل كوحدات مفردة:

python
emoji = "😊🚀✨" print(emoji[1]) # 🚀

معالجة الاستثناءات عند الفهرسة

من الأفضل دائمًا التحقق من طول السلسلة قبل الوصول إلى فهرس معين لتجنب الأخطاء:

python
s = "Hi" index = 5 if index < len(s): print(s[index]) else: print("الفهرس خارج النطاق")

جدول: مقارنة بين عمليات الفهرسة والتقسيم والاستخلاص النصي

العملية الاستخدام ناتج العملية قابلية الاستخدام مع Unicode
فهرسة إيجابية text[2] حرف مفرد نعم
فهرسة سلبية text[-1] الحرف الأخير نعم
تقسيم بدون خطوة text[1:4] حروف من الموضع 1 إلى 3 نعم
تقسيم بخطوة text[::2] حروف بفاصل 2 نعم
عكس السلسلة text[::-1] نفس السلسلة بالعكس نعم

ملاحظات ختامية حول الأداء والذاكرة

عند تنفيذ عمليات الفهرسة أو التقسيم على السلاسل النصية، فإن بايثون لا تُعدل السلسلة الأصلية، بل تُنشئ نسخة جديدة في الذاكرة. وهذا يُعد مفيدًا عند الحاجة إلى ضمان سلامة البيانات الأصلية، لكنه يتطلب الانتباه لاستهلاك الذاكرة عند التعامل مع سلاسل ضخمة. يُوصى باستخدام المعالجة الكسولة (Lazy Processing) عند تحليل ملفات كبيرة باستخدام مولدات أو التعبيرات المنتجة.


المصادر والمراجع

  1. Python Software Foundation. Python 3 Documentation – https://docs.python.org/3/

  2. Luciano Ramalho, Fluent Python, O’Reilly Media, 2nd Edition, 2021.