المسارات
/
Python
Python
/
المنهج
/
السلاسل النصية
ال

السلاسل النصية في Python

83 تمرينًا

نبذة عن السلاسل النصية

str في Python هو تسلسل غير قابل للتغيير من نقاط ترميز يونيكود. وقد تشمل هذه نقاط حروفًا وعلامات تشكيل ومحارف تموضع وأرقامًا ورموز عملات ورموزًا تعبيرية وعلامات ترقيم ومسافات ومحارف فواصل الأسطر وغير ذلك.

للتعمق في المعلومات التي تُرمّزها السلسلة النصية (أو "كيف يعرف الحاسوب كيفية تحويل الأصفار والآحاد إلى حروف؟")، هذه التدوينة مفيدة على الدوام. كما تقدم وثائق Python دليلًا مفصلًا جدًا حول يونيكود يناقش دعم Python لمواصفة يونيكود في وحدات str وbytes وre، واعتبارات الإعدادات المحلية، وبعض المشكلات الشائعة المتعلقة بالترميز والتحويل.

تُطبّق السلاسل النصية كل عمليات التسلسل الشائعة، ويمكن تكرارها باستخدام صيغة for item in <str> أو for index, item in enumerate(<str>). ويمكن الإشارة إلى نقاط الترميز المفردة (سلاسل نصية بطول 1) عبر رقم 0-based index من اليسار، أو رقم -1-based index من اليمين.

ويمكن ضمّ السلاسل النصية باستخدام <str> + <other str> أو <str>.join(<iterable>)، وتقسيمها عبر <str>.split(<separator>). كما تقدم عدة خيارات إضافية للتنسيق والتجميع والقوالب.

يمكن تعريف قيمة حرفية من النوع str باستخدام علامتَي تنصيص مفردتين ' أو مزدوجتين ". ومحرف الهروب \ متاح عند الحاجة.


>>> single_quoted = 'These allow "double quoting" without "escape" characters.'

>>> double_quoted = "These allow embedded 'single quoting', so you don't have to use an 'escape' character."

تُعرَّف السلاسل النصية متعددة الأسطر باستخدام ''' أو """.

>>> triple_quoted = '''Three single quotes or "double quotes" in a row allow for multi-line string literals.
  Line break characters, tabs and other whitespace is fully supported. Remember - The escape "\" character is also available if needed (as can be seen below). 
  
  You\'ll most often encounter multi-line strings as "doc strings" or "doc tests" written just below the first line of a function or class definition.
    They\'re often used with auto documentation ✍ tools.
    '''

يمكن استخدام المُنشئ str(<object>) لإنشاء السلاسل النصية من كائنات أخرى أو تحويلها:

>>> my_number = 42
>>> str(my_number)
...
"42"

وبينما يمكن استخدام المُنشئ str(<object>) لتحويل الكائنات إلى سلاسل نصية، فإنه لن يمرّ عليها بالتكرار ولن يفكّ حزمة الكائن. وهذا يختلف عن سلوك المُنشئات الخاصة بأنواع بيانات أخرى مثل list() وset() وdict() وtuple()، وقد يؤدي إلى نتائج مفاجئة.

>>> numbers = [1,3,5,7]
>>> str(numbers)
...
'[1,3,5,7]'

يمكن الإشارة إلى نقاط الترميز داخل str برقم 0-based index من اليسار:

creative = '창의적인'

>>> creative[0]
'창'

>>> creative[2]
'적'

>>> creative[3]
'인'

وتعمل الفهرسة أيضًا من اليمين، بدءًا من -1-based index:

creative = '창의적인'

>>> creative[-4]
'창'

>>> creative[-2]
'적'

>>> creative[-1]
'인'

لا يوجد في Python نوع منفصل “محرف” أو "rune"، لذا فإن فهرسة سلسلة نصية تُنتج سلسلة نصية جديدة من النوع str بطول 1:


>>> website = "exercism"
>>> type(website[0])
<class 'str'>

>>> len(website[0])
1

>>> website[0] == website[0:1] == 'e'
True

يمكن اختيار سلاسل فرعية عبر تدوين الشرائح، باستخدام <str>[<start>:<stop>:<step>] لإنتاج سلسلة نصية جديدة. وتستبعد النتائج فهرس stop. إذا لم يُحدَّد start، يكون فهرس البداية 0. وإذا لم يُحدَّد stop، يكون فهرس stop نهاية السلسلة النصية.

moon_and_stars = '🌟🌟🌙🌟🌟⭐'

>>> moon_and_stars[1:4]
'🌟🌙🌟'

>>> moon_and_stars[:3]
'🌟🌟🌙'

>>> moon_and_stars[3:]
'🌟🌟⭐'

>>> moon_and_stars[:-1]
'🌟🌟🌙🌟🌟'

>>> moon_and_stars[:-3]
'🌟🌟🌙'

يمكن أيضًا تجزئة السلاسل النصية إلى سلاسل أصغر عبر <str>.split(<separator>)، وهي تُرجع list من السلاسل الفرعية. واستخدام <str>.split() دون أي وسائط يقسّم السلسلة النصية عند المسافات البيضاء.

>>> cat_ipsum = "Destroy house in 5 seconds command the hooman."
>>> cat_ipsum.split()
...
['Destroy', 'house', 'in', '5', 'seconds', 'command', 'the', 'hooman.']


>>> cat_words = "feline, four-footed, ferocious, furry"
>>> cat_words.split(',')
...
['feline', ' four-footed', ' ferocious', ' furry']


>>> colors = """red,
orange,
green,
purple,
yellow"""

>>> colors.split(',\n')
['red', 'orange', 'green', 'purple', 'yellow']

يمكن ضمّ السلاسل النصية باستخدام العامل +. ويُفضّل استخدام هذا الأسلوب باعتدال، لأنه ليس عالي الأداء ولا سهل الصيانة.

language = "Ukrainian"
number = "nine"
word = "дев'ять"

sentence = word + " " + "means" + " " + number + " in " + language + "."

>>> print(sentence)
...
"дев'ять means nine in Ukrainian."

إذا احتجت إلى دمج list أو tuple أو set أو أي مجموعة أخرى من السلاسل النصية المفردة في سلسلة نصية واحدة من النوع str، فإن <str>.join(<iterable>) خيار أفضل:

# str.join() makes a new string from the iterables elements.
>>> chickens = ["hen", "egg", "rooster"] # Lists are iterable.
>>> ' '.join(chickens)
'hen egg rooster'

# Any string can be used as the joining element.
>>> ' :: '.join(chickens)
'hen :: egg :: rooster'

>>> ' 🌿 '.join(chickens)
'hen 🌿 egg 🌿 rooster'


# Any iterable can be used as input.
>>> flowers = ("rose", "daisy", "carnation")  # Tuples are iterable.
>>> '*-*'.join(flowers)
'rose*-*daisy*-*carnation'

>>> flowers = {"rose", "daisy", "carnation"}  # Sets are iterable, but output order is not guaranteed.
>>> '*-*'.join(flowers)
'rose*-*carnation*-*daisy'

>>> phrase = "This is my string"  # Strings are iterable, but be careful!
>>> '..'.join(phrase)
'T..h..i..s.. ..i..s.. ..m..y.. ..s..t..r..i..n..g'


# Separators are inserted **between** elements, but can be any string (including spaces).
# This can be exploited for interesting effects.
>>> under_words = ['under', 'current', 'sea', 'pin', 'dog', 'lay']
>>> separator = ' ⤴️ under' # Note the leading space, but no trailing space.
>>> separator.join(under_words)
'under ⤴️ undercurrent ⤴️ undersea ⤴️ underpin ⤴️ underdog ⤴️ underlay'

# The separator can be composed different ways, as long as the result is a string.
>>> upper_words = ['upper', 'crust', 'case', 'classmen', 'most', 'cut']
>>> separator = ' 🌟 ' + upper_words[0] # This becomes one string, similar to ' ⤴️ under'.
>>> separator.join(upper_words)
 'upper 🌟 uppercrust 🌟 uppercase 🌟 upperclassmen 🌟 uppermost 🌟 uppercut'

تدعم السلاسل النصية كل عمليات التسلسل الشائعة. ويمكن المرور على نقاط الترميز المفردة بالتكرار في حلقة عبر for item in <str>. ويمكن تكرار الفهارس مع العناصر في حلقة عبر for index, item in enumerate(<str>).


>>> exercise = 'လေ့ကျင့်'

# Note that there are more code points than perceived glyphs or characters.
# Care should be used when iterating over languages that use
# combining characters, or when dealing with emoji.
>>> for code_point in exercise:
...    print(code_point)
...
လ
ေ
့
က
ျ
င
်
့

# Using enumerate will give both the value and index position of each element.
>>> for index, code_point in enumerate(exercise):
...    print(index, ": ", code_point)
...
0 :  လ
1 :  ေ
2 :  ့
3 :  က
4 :  ျ
5 :  င
6 :  ်
7 :  ့

طُرُق السلاسل النصية

توفر Python مجموعة غنية من طرق السلاسل النصية التي تساعد في البحث والتنظيف والتقسيم والتحويل والترجمة وغير ذلك من العمليات. وسيُتناول عدد مختار من هذه الطرق في تمرين آخر.

التنسيق

توفر Python أيضًا مجموعة غنية من الأدوات لتنسيق السلاسل النصية واستخدام القوالب معها، فضلًا عن معالجة نصوص أكثر تقدمًا عبر وحدات re (التعبيرات النمطية) وdifflib (مقارنة التسلسلات) وtextwrap. ولمقدمة رائعة عن تنسيق السلاسل النصية في Python، اطّلع على هذا المقال في Real Python. ولمقدمة عن طرق السلاسل النصية، اطّلع على السلاسل النصية وبيانات المحارف في Python في الموقع نفسه.

الأنواع والترميزات ذات الصلة

بالإضافة إلى str (وهو تسلسل نصي)، تمتلك Python أنواع تسلسلات ثنائية مقابلة، مجمّعة تحت خدمات البيانات الثنائية، وهي bytes (تسلسل ثنائي) وbytearray وmemoryview، لتخزين البيانات الثنائية ومعالجتها بكفاءة. إضافة إلى ذلك، تتيح التدفقات إرسال البيانات الثنائية واستقبالها عبر اتصال شبكي دون استخدام دوال الاستدعاء الراجعة.

تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة

تعلّم السلاسل النصية

التدريب مقفل

افتح 4 تمارين إضافية لممارسة السلاسل النصية