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

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث

يمكن التعامل مع البيانات النصية في بايثون باستخدام كائنات str أو السلاسل النصية strings، وهي تسلسلات sequences غير قابلة للتغيير immutable من رموز Unicode.

هناط طرق مختلفة للتعبير عن السلاسل النصية، إذ يمكن أن تحاط بعلامات اقتباس مفردة ('...') أو مزدوجة ("...")، ويستخدم الرمز \ لتهريب علامات الاقتباس:

>>>
>>> 'spam eggs'  # علامات اقتباس مفردة
'spam eggs'
>>> 'doesn\'t'  # استخدم \' لتهريب علامات الاقتباس المفردة...‏
"doesn't"
>>> "doesn't"  # ...أو استخدم علامات الاقتباس المزدوجة
"doesn't"
>>> '"Yes," he said.'
'"Yes," he said.'
>>> "\"Yes,\" he said."
'"Yes," he said.'
>>> '"Isn\'t," she said.'
'"Isn\'t," she said.'

استخدام السلاسل النصية

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

تحاط السلسلة النصية بعلامات اقتباس مزدوجة إن كانت تحتوي على علامات اقتباس مفردة، أما إذا احتوت على علامات اقتباس مزدوجة فإنّها تحاط بعلامات اقتباس مفردة.

تنتج الدالة print() مخرجات سهلة القراءة وذلك بحذف علامات الاقتباس التي تحيط بالسلسلة النصية وطباعة الأحرف الخاصّة والمهرّبة.

في المثال التالي يستخدم الحرف الخاص ‎\n ضمن السلسلة النصية والذي يظهر في السلسلة النصية المخرجة دون استخدام الدالة print()، وتحوّله الدالة إلى سطر جديد:

>>>
>>> '"Isn\'t," she said.'
'"Isn\'t," she said.'
>>> print('"Isn\'t," she said.')
"Isn't," she said.
>>> s = 'First line.\nSecond line.'
>>> s  
'First line.\nSecond line.'
>>> print(s)  
First line.
Second line.

إن كنت لا ترغب في تحويل الأحرف الخاصة المسبوقة بالعلامة \ يمكنك استخدام السلاسل النصية الخام وذلك بإضافة الحرف r (اختصار raw) قبل علامة الاقتباس الأولى.

في المثال التالي يظهر الحرف الخاص ‎\n ضمن السلسلة النصية، لاحظ الفرق بين المخرجات:

>>>
>>> print('C:\some\name') 
C:\some
ame
>>> print(r'C:\some\name')  # note the r before the quote
C:\some\name

يمكن للسلاسل النصية أن تمتدّ لعدة أسطر، وذلك باستخدام علامات اقتباس ثلاثية """...""" أو '''...'''. تضاف نهايات الأسطر إلى السلسلة النصية تلقائيًا، ولكن يمكن تجنّب ذلك بإضافة الرمز \ في نهاية السطر، فعلى سبيل المثال:

print("""\
Usage: thingy [OPTIONS]
     -h                        Display this usage message
     -H hostname               Hostname to connect to
""")

تعطي الشيفرة السابقة المخرجات التالية (لاحظ غياب السطر الجديد في بداية السلسلة):

Usage: thingy [OPTIONS]
     -h                        Display this usage message
     -H hostname               Hostname to connect to

ربط السلاسل النصية وتكرارها

يمكن ربط السلاسل النصية بعضها ببعض بواسطة العامل +، ويمكن تكرار السلاسل باستخدام العامل *، فمثلًا، تكرر الشيفرة التالية السلسلة النصية 'un' ثلاث مرات وتربطها بعد ذلك بالسلسلة النصية 'ium':

>>>
>>> 3 * 'un' + 'ium'
'unununium'

تربط بايثون السلاسل النصية المتجاورة بعضها ببعض تلقائيًا:

>>>
>>> 'Py' 'thon'
'Python'

هذه الخاصية مفيدة عند الحاجة إلى لتقسيم السلاسل الطويلة:

>>>
>>> text = ('Put several strings within parentheses '
...         'to have them joined together.')
>>> text
'Put several strings within parentheses to have them joined together.'

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

>>>
>>> prefix = 'Py'
>>> prefix 'thon'  # لا يمكن ربط السلسلة النصية بالمتغيرات
  ...
SyntaxError: invalid syntax
>>> ('un' * 3) 'ium'
  ...
SyntaxError: invalid syntax

استخدم العامل + لربط المتغيرات أو المتغيرات مع السلاسل النصية:

>>>
>>> prefix + 'thon'
'Python'

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

يمكن فهرسة السلاسل النصية في بايثون، ويحمل الحرف الأول رقم الفهرس 0. نوع الأحرف المفردة غير متوفّر في بايثون، فالحرف المفرد هو ببساطة سلسلة نصية ذات عنصر واحد:

>>>
>>> word = 'Python'
>>> word[0]  # الحرف في الموقع 0
'P'
>>> word[5]  # الحرف في الموقع 5
'n'

يمكن لأرقام الفهارس أن تكون سالبة، وحينئذ يبدأ العدّ من اليمين:

>>>
>>> word[-1]  # الحرف الأخير
'n'
>>> word[-2]  # الحرف ما قبل الأخير
'o'
>>> word[-6]
'P'

لاحظ أنّه لمّا كان ‎-0 و 0 متساويان، فإنّ الفهارس السالبة تبدأ من ‎-1.

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

إضافة إلى الفهرسة تدعم بايثون عملية الاقتطاع (Slicing) أيضًا. تستخدم الفهرسة للحصول على أحرف مفردة، أما عملية التقطيع فتتيح الحصول على جزء من السلسلة النصية:

>>>
>>> word[0:2]  # الحروف من الموقع 0 (مشمول) إلى الموقع 2 (غير مشمول)‏
'Py'
>>> word[2:5]  # الحروف من الموقع 2 (مشمول) إلى الموقع 5 (غير مشمول)‏
'tho'

لاحظ أنّ الرقم الأول يكون مشمولًا دائمًا بعملية الاقتطاع أما الرقم الأخير فلا يكون مشمولًا. وهكذا فإن التعبير s[:i] + s[i:]‎ يساوي s دائمًا:

>>>
>>> word[:2] + word[2:]
'Python'
>>> word[:4] + word[4:]
'Python'

هناك بعض القيم الافتراضية المفيدة في خاصية التقطيع، فإذا حذف الرقم الأول فإنّ القيمة الافتراضية له ستكون صفرًا، وإذا حُذف الرقم الثاني فإنّ القيمة الافتراضية تكون طول السلسلة النصية التي سيجري اقتطاعها.

>>>
>>> word[:2]   # اقتطاع الحروف من الموقع 0 إلى الموقع 2 (غير مشمول)‏
'Py'
>>> word[4:]   # اقتطاع الحروف من الموقع 4 (مشمول) إلى نهاية السلسلة
'on'
>>> word[-2:]  # الحروف من الموقع 2 من اليمين (مشمول) إلى نهاية السلسلة
'on'

لتتذكّر كيف تجري عملية الاقتطاع يمكنك التفكير في الفهارس وكأنّها فواصل بين الحروف، وتأخذ الحافة اليسرى من الحرف الأول الرقم 0، وتأخذ الحافة اليمنى من الحرف الأخير في السلسلة النصية المكوّنة من n حروف الرقم n، فمثلًا:

 +---+---+---+---+---+---+
 | P | y | t | h | o | n |
 +---+---+---+---+---+---+
 0   1   2   3   4   5   6
-6  -5  -4  -3  -2  -1

يظهر في الصف الأول الأرقام التي تشير إلى مواقع الفهارس في السلسلة النصية 0...6، أما الصفّ الثاني فتشير الأرقام فيه إلى الفهارس السالبة. وتتكون القطعة التي تبدأ بالفهرس i وتنتهي بالفهرس j من جميع الحروف الموجودة بين الحافتين i و j على التوالي.

يكون طول القطعة عند استخدام الفهارس غير السالبة هو الفرق بين الرقمين إن كانا ضمن الحدود، فعلى سبيل المثال طول القطعة word[1:3]‎ هو 2.

تؤدي محاولة استخدام فهرس كبير جدًّا (يتجاوز طول السلسلة النصية) إلى حدوث خطأ:

>>>
>>> word[42]  # السلسلة النصية فيها 6 محارف فقط
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: string index out of range

ولكن لا تظهر هذه الأخطاء عند اقتطاع السلاسل النصية:

>>>
>>> word[4:42]
'on'
>>> word[42:]
''

تمتاز السلاسل النصية في بايثون بأنّها غير قابلة للتعديل immutable؛ لذا فإنّ إسناد قيمة إلى موقع مفهرس ضمن السلسلة سيؤدي إلى حدوث خطأ:

>>>
>>> word[0] = 'J'
  ...
TypeError: 'str' object does not support item assignment
>>> word[2:] = 'py'
  ...
TypeError: 'str' object does not support item assignment

إن كنت ترغب في تغيير السلسلة النصية، فيجب إنشاء واحدة جديدة:

>>>
>>> 'J' + word[1:]
'Jython'
>>> word[:2] + 'py'
'Pypy'
تعيد الدالة الداخلية len() طول السلسلة النصية:
>>>
>>> s = 'supercalifragilisticexpialidocious'
>>> len(s)
34

التحويل إلى سلسلة نصية

تستخدم الدالة str()‎ لتحويل الكائنات إلى سلاسل نصية، وتعيد سلسلة فارغة في حال عدم تقديم كائن لها. تعيد الدالة str(object)‎ التابع object.__str__()‎ وهو عبارة عن تمثيل للكائن على هيئة سلسلة نصية قابلة للطباعة ومنسّقة بصورة جيدة. إن كان الكائن سلسلة نصية فإنّ الدالة تعيد السلسلة النصّية ذاتها. إن لم يمتلك الكائن تابع ‎__str__()‎ فإنّ الدالة str()‎ ستتراجع (fall back) إلى الدالة repr(object)‎.

>>> str()
''
>>> str(3)
'3'
>>> str(set())
'set()'
>>> str([1])
'[1]'
>>> x = [1, 2, 3]
>>> str(x)
'[1, 2, 3]'
>>> y = 2-3j
>>> str(y)
'(2-3j)
>>> z = "Python"
>>> str(z)
'Python'

مصادر