تعلم أي شيء جديد يمكن أن يشكل تحديًا. كلما عملت مع بايثون أكثر، لاحظت عدد مرات ظهور السلاسل النصية. يعد التعامل مع السلسلة في بايثون مهارة مهمة. في هذه المقالة، نقدم لك مقدمة لإنشاء سلسلة فرعية من سلسلة في بايثون.
تقطيع وتقسيم السلاسل
الطريقة الأولى للحصول على سلسلة فرعية من سلسلة في بايثون هي عن طريق التقطيع والتقسيم. لنبدأ بتعريف سلسلة، ثم ننتقل إلى بعض الأمثلة:
>>> string = 'This is a sentence. Here is 1 number.'
يمكنك تقسيم هذه السلسلة إلى سلاسل فرعية، كل منها يحتوي على نوع البيانات str
. حتى لو كانت السلسلة الخاصة بك عبارة عن رقم، فهي لا تزال من هذا النوع من البيانات. يمكنك اختبار ذلك باستخدام دالة type()
المضمنة. قد تكون الأرقام من أنواع أخرى أيضًا، بما في ذلك نوع البيانات العشرية، الذي ناقشناه هنا.
كما هو الحال مع المصفوفات والقوائم في بايثون، يمكن تقسيم السلاسل عن طريق تحديد فهارس البداية والنهاية، داخل قوسين مربعين وفصلهما بنقطتين. يؤدي هذا إلى إرجاع سلسلة فرعية من السلسلة الأصلية.
تذكر أن الفهرسة في بايثون تبدأ من 0. للحصول على أول 7 أحرف من السلسلة، ما عليك سوى القيام بما يلي:
>>> print(string[:7])
This is
لاحظ هنا أننا لم نحدد بشكل صريح فهرس البداية. ولذلك، فإنه يأخذ قيمة افتراضية 0.
بالمناسبة، إذا كنت تريد المزيد من المعلومات حول دالة print()
، فراجع هذه المقالة. ربما يكون هناك ما هو أكثر مما تدرك.
يمكننا أيضًا فهرسة نسبة إلى نهاية السلسلة عن طريق تحديد قيمة بداية سلبية:
>>> print(string[-7:])
number.
نظرًا لأننا لم نحدد قيمة نهائية، فإنها تأخذ القيمة الافتراضية len(string)
. إذا كنت تعرف فهارس البداية والنهاية لكلمة معينة، فيمكنك استخراجها من السلسلة كما يلي:
>>> print(string[10:18])
sentence
ومع ذلك، هذا ليس الأمثل لاستخراج الكلمات الفردية من سلسلة لأنه يتطلب معرفة الفهارس مقدما.
هناك خيار آخر للحصول على سلسلة فرعية من السلسلة وهو تقسيمها إلى كلمات، وهو ما يمكن القيام به باستخدام التابع string.split()
. يتطلب هذا وسيطتين اختياريتين: سلسلة تحدد الأحرف التي سيتم تقسيمها (الإعداد الافتراضي لأي مسافة بيضاء)، والحد الأقصى لعدد الانقسامات (الإعداد الافتراضي هو -1، مما يعني عدم وجود حد). على سبيل المثال، إذا أردنا التقسيم على مسافة، يمكنك القيام بما يلي، مما يؤدي إلى إرجاع قائمة من السلاسل:
>>> string.split(' ')
['This', 'is', 'a', 'sentence.', 'Here', 'is', '1', 'number.']
لكن لاحظ أن النقطة (حرف النقطة) موجودة في نهاية الكلمتين “sentence” و”number”. سنعود إلى هذا لاحقًا في المقالة عندما ننظر إلى التعبيرات العادية.
هناك الكثير من توابع السلسلة المضمنة في بايثون. حيث تسمح لك بتعديل سلسلة أو اختبار خصائصها أو البحث فيها. إحدى التوابع المفيدة لإنشاء سلسلة فرعية أكثر تعقيدًا من سلسلة في بايثون هي string.join()
. تأخذ تكرارًا من السلاسل وتنضم إليهم. هنا مثال:
>>> print(' and '.join(['one', 'two', 'three']))
one and two and three
باستخدام خدعة فهرسة ذكية، يمكن استخدام ذلك لطباعة سلسلة فرعية تحتوي على كل كلمة ثانية من الكلمة الأصلية:
>>> print(' '.join(string.split(' ')[::2]))
This a Here 1
نظرًا لأن الإدخال في التابع join()
يأخذ قائمة، فيمكنك القيام بفهم القائمة لإنشاء سلسلة فرعية من جميع الكلمات بطول يساوي 4، على سبيل المثال. لأولئك الذين يبحثون عن تمرين أكثر تحديًا، جربوا ذلك بأنفسكم. سنعرض لك أيضًا طريقة مختلفة للقيام بذلك لاحقًا في المقالة. إذا كنت تريد معرفة كيفية كتابة سلاسل إلى ملف في بايثون، راجع هذه المقالة.
وحدة parse
هناك وحدة غير معروفة تسمى PARSE مع وظيفة رائعة لإنشاء سلسلة فرعية في بايثون. لا تأتي هذه الوحدة بشكل قياسي ويجب تثبيتها بشكل منفصل. أفضل طريقة هي تشغيل أمر pip install
من الطرفية.
إليك كيفية الحصول على سلسلة فرعية باستخدام دالة parse، التي تقبل وسيطتين:
>>> import parse
>>> substring = parse.parse('This is {}. Here is 1 {}.', 'This is a sentence. Here is 1 number.')
>>> substring.fixed
('a sentence', 'number')
يؤدي استدعاء التابع fixed
على substring
إلى إرجاع صف من السلاسل الفرعية المستخرجة من الوسيطة الثانية عند موضع الأقواس المتعرجة {}
في الوسيطة الأولى. بالنسبة لأولئك الذين هم على دراية بتنسيق السلسلة، قد يبدو هذا مألوفًا بشكل مثير للريبة. في الواقع، وحدة parse هي عكس format()
. تحقق من ذلك، والذي يفعل عكس مقتطف الشيفرة أعلاه:
>>> print('This is {}. Here is 1 {}.'.format('a sentence', 'number'))
This is a sentence. Here is 1 number.
بينما نتحدث عن وحدة parse، فمن المفيد مناقشة دالة search، نظرًا لأن البحث هو حالة استخدام شائعة عند العمل مع السلاسل النصية. تحدد الوسيطة الأولى للبحث ما تبحث عنه عن طريق تحديد مصطلح البحث باستخدام الأقواس المتعرجة. والثاني يحدد أين ننظر.
إليكم مثال:
>>> result = parse.search('is a {}.', 'This is a sentence. Here is 1 number')
>>> result.fixed
('sentence',)
مرة أخرى، يؤدي استدعاء التابع fixed
إلى إرجاع صف مع النتائج. إذا كنت تريد فهارس البداية والنهاية للنتيجة، فاستدعي التابع spans. يعد استخدام وحدة parse للبحث في سلسلة أمرًا رائعًا – فهو قوي جدًا لكيفية تحديد ما تبحث عنه (أي الوسيطة الأولى).
التعبيرات القياسية
آخر وحدة Python نريد مناقشتها هي re، وهو اختصار لـ “regex”، والذي هو في حد ذاته اختصار لـ “regular expression”. يمكن أن تكون التعبيرات العادية مخيفة بعض الشيء – فهي تتضمن تعريف أنماط متخصصة للغاية ومعقدة في بعض الأحيان للبحث في السلاسل.
يمكنك استخدام التعبيرات العادية لاستخراج سلاسل فرعية في بايثون. الموضوع عميق للغاية بحيث لا يمكن تغطيته هنا بشكل شامل، لذا سنذكر فقط بعض الوظائف المفيدة ونقدم لك فكرة عن كيفية تعريف أنماط البحث. لمزيد من المعلومات حول هذه الوحدة ووظائفها، راجع الوثائق.
تأخذ دالة findall()
وسيطتين مطلوبتين: pattern وstring. لنبدأ باستخراج كل الكلمات من السلسلة التي استخدمناها أعلاه:
>>> re.findall(r'[a-z]+', 'This is a sentence. Here is 1 number.', flags=re.IGNORECASE)
['This', 'is', 'a', 'sentence', 'Here', 'is', 'number']
يتوافق نمط [a-z]
مع جميع الأحرف الصغيرة، ويشير الرمز +
إلى أن الكلمات قد تكون بأي طول، ويخبرك العلم بتجاهل حالة الأحرف. قارن هذا بالنتيجة التي حصلنا عليها أعلاه باستخدام string.split()
، وستلاحظ أن النقطة الكاملة غير مضمنة.
الآن، دعونا نستخرج جميع الأرقام من السلسلة:
>>> re.findall(r'\b\d+\b', 'This is a sentence. Here is 1 number.')
['1']
\b
يتطابق مع حد في بداية ونهاية النمط، \d
يتطابق مع أي رقم من 0 إلى 9، ومرة أخرى يشير +
إلى أن الأرقام قد تكون بأي طول. على سبيل المثال، نجد جميع الكلمات بطول 4 أحرف مع ما يلي:
>>> re.findall(r'\b\w{4}\b', 'This is a sentence. Here is 1 number.')
['This', 'Here']
\w
يتطابق مع أي كلمات، و{4} يحدد طول الكلمات التي يجب مطابقتها. لتوليد سلسلة فرعية، ما عليك سوى استخدام string.join()
كما فعلنا أعلاه. هذا نهج بديل لفهم القائمة الذي ذكرناه سابقًا، والذي يمكن استخدامه أيضًا لتوليد سلسلة فرعية بكل الكلمات بطول 4.
هناك وظائف أخرى في هذه الوحدة تستحق إلقاء نظرة عليها. يمكن استخدام match()
لتحديد ما إذا كان النمط يتطابق في بداية السلسلة، كما تقوم search()
بالبحث عبر السلسلة للبحث عن أي موقع يحدث فيه النمط.
أفكار ختامية حول إنشاء سلاسل فرعية في بايثون
في هذه المقالة، ناقشنا استخراج وطباعة سلاسل فرعية من السلاسل في بايثون. استخدم هذا كأساس لاستكشاف مواضيع أخرى مثل استخراج البيانات من موقع ويب. هل يمكنك تعريف نمط تعبير عادي لاستخراج عنوان بريد إلكتروني من سلسلة؟ أو إزالة علامات الترقيم من هذه الفقرة؟ إذا كان بإمكانك ذلك، فأنت في طريقك إلى أن تصبح خبيرًا في البيانات!
إذا كنت تعمل أيضًا كثيرًا مع البيانات الجدولية، فلدينا مقال يوضح لك كيفية طباعة الجداول بشكل جميل في بايثون. إن إضافة كل هذه المهارات ببطء إلى مجموعة أدواتك ستحولك إلى مبرمج خبير.
اكتشاف المزيد من بايثون العربي
اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.