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

من موسوعة حسوب
مراجعة 08:55، 23 يونيو 2022 بواسطة عبد اللطيف ايمش (نقاش | مساهمات)
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)

يمكن التعامل مع البيانات النصية في بايثون باستخدام كائنات 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.'
دورة تطوير التطبيقات باستخدام لغة Python
  • 69 ساعة فيديو تدريبية
  • من الصفر دون الحاجة لخبرة مسبقة
  • شهادة معتمدة من أكاديمية حسوب
  • متابعة أثناء الدورة من فريق مختص

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

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

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

تنتج الدالة 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.

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

>>> 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'

الدوال التابعة للكائن str

يدعم الكائن str جميع العمليات المشتركة بين أنواع التسلسلات في بايثون، إضافة إلى بعض الدوال الخاصة:

str.capitalize()‎

تعيد الدالة نسخة من السلسلة النصية مع تحويل الحرف الأول إلى حرف كبير، والأحرف الباقية إلى أحرف صغيرة.

str.casefold()‎

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

str.center()‎

تعيد الدالة أحرف السلسلة النصية مزاحة نحو الوسط ضمن سلسلة نصّية ذات طول محدّد.

str.count()‎

تعيد هذه الدالة عدد مرات ظهور سلسلة نصية فرعية ضمن السلسلة الأصلية.

str.encode()‎

تعيد الدالة نسخة مرمّزة من السلسلة النصية على هيئة بايتات.

str.endswith()‎

تتحقّق الدالة من وجود سلسلة نصية فرعية في نهاية السلسلة النصية الأصلية.

str.expandtabs()‎

تعيد الدالة ‎ نسخة من السلسلة النصية بعد تحويل جميع علامات الجدولة إلى مسافة بيضاء واحدة أو أكثر.

str.find()‎

تعيد الدالة أدنى قيمة للفهرس في السلسلة النصية والذي تكون السلسلة الفرعية موجودة فيه ضمن الجزء المقتطع من السلسلة.

str.format()‎

تؤدي هذه الدالة عمليات التنسيق على السلسلة النصية بواسطة معاملات موضعية أو مفتاحية.

str.format_map()‎

تؤدّي هذه الدالة عمليات التنسيق على السلسلة النصية بواسطة قاموس.

str.index()‎

تؤدي هذه الدالة نفس وظيفة الدالة str.find()‎ ولكنّها تطلق الخطأ ValueError إن لم تعثر على السلسلة الفرعية.

str.isalnum()‎

تتحقّق هذه الدالة ممّا إذا كانت السلسلة النصية تضمّ حروفًا وأرقامًا وأنّها تضمّ حرفًا واحدًا على الأقل.

str.isalpha()‎

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

str.isdecimal()‎

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

str.isdigit()‎

تتحقّق الدالة ممّا إذا كانت السلسلة النصية مكوّنة من حروف الأعداد (digits) فقط، وأنّ فيها حرفًا واحدًا على الأقل.

str.isidentifier()‎

تتحقّق الدالة ممّا إذا كانت السلسلة النصية تتضمّن معرّفًا صحيحًا (identifier) في لغة بايثون.

str.islower()‎

تتحقّق الدالة ممّا إذا كانت حروف السلسلة النصية حروفًا صغيرة lower case.

str.isnumeric()‎

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

str.isprintable()‎

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

str.isspace()‎

تحقّق الدالة ممّا إذا كانت السلسلة النصية مكوّنة من حروف مسافات بيضاء فقط وأنّ في السلسلة حرفًا واحدًا على الأقل.

str.istitle()‎

تتحقّق الدالة ممّا إذا كانت أوائل الكلمات في السلسلة النصية حروفًا كبيرة (titlecased).

str.isupper()‎

تتحقّق الدالة ممّا إذا كانت جميع الحروف في السلسلة النصية حروفًا كبيرة.

str.join()‎

تعيد الدالة السلسلة النصية الناتجة عن ربط السلاسل النصية التابعة لكائن قابل للتكرار (iterable).

str.ljust()‎

تعيد الدالة أحرف السلسلة النصية مزاحة نحو اليسار ضمن سلسلة نصّية ذات طول محدّد.

str.lower()‎

تحول الدالة جميع الحروف في السلسلة النصية إلى حروف صغيرة.

str.lstrip()‎

تحذف الدالة الحروف التي يحدّدها المستخدم من بداية السلسلة النصية.

str.maketrans()‎

تعيد هذه الدالة الساكنة جدول ترجمة يمكن استخدامه بواسطة الدالة str.translate().

str.partition()‎

تقسم هذه الدالة السلسلة النصية عند أول ظهور للقيمة التي يحدّدها المستخدم.

str.replace()‎

تبدّل هذه الدالة العبارة التي يختارها المستخدم - مهما تكرّرت في السلسلة النصية - بالقيمة الجديدة التي يحدّدها.

str.rfind()‎

تعيد الدالة أعلى قيمة للفهرس في السلسلة النصية حيث تجد فيه السلسلة النصية الفرعية.

str.rindex()‎

تعيد الدالة أعلى قيمة للفهرس في السلسلة النصية حيث تجد فيه السلسلة النصية الفرعية.

str.rjust()‎

تعيد الدالة أحرف السلسلة النصية مزاحة نحو اليمين ضمن سلسلة نصّية ذات طول محدّد.

str.rpartition()‎

تقسم هذه الدالة السلسلة النصية عند آخر ظهور للقيمة التي يحدّدها المستخدم.

str.rsplit()‎

تحوّل هذه الدالة السلسلة النصية من جهة اليمين إلى قائمة من السلاسل النصية بالاعتماد على الفاصل الذي يحدّده المستخدم.

str.rstrip()‎

تحذف الدالة الحروف التي يحدّدها المستخدم من نهاية السلسلة النصية.

str.split()‎

تقسّم الدالة السلسلة النصية إلى قائمة من السلاسل النصية بالاعتماد على فاصل محدّد.

str.splitlines()‎

تقسم الدالة السلسلة النصية إلى قائمة من الأسطر.

str.startswith()‎

تتحقّق الدالة من أنّ السلسلة النصية تبدأ بالقيمة التي يحدّدها المستخدم.

str.strip()‎

تحذف الدالة الحروف المحدّدة من قبل المستخدم من نهاية وبداية السلسلة النصية.

str.swapcase()‎

تقلب الدالة‎ حالة الحروف في السلسلة النصية.

str.title()‎

تحوّل الدالة‎ أوائل الكلمات في السلسلة النصية إلى أحرف كبيرة Title Case.

str.translate()‎

تعيد الدالة‎ الحروف في السلسلة النصية بالاعتماد على جدول الترجمة translation table.

str.upper()‎

تحوّل الدالة‎ الحروف في السلسلة النصية إلى حروف كبيرة.

str.zfill()‎

تضيف الدالة‎ أصفارًا من الترميز ASCII إلى يسار السلسلة النصية لتصبح السلسلة بالطول المحدد من قبل المستخدم.

انظر أيضًا

مصادر