بايثونالتعامل مع النصوص
- مفهوم النصوص
- طريقة تعريف نص
- دمج النصوص
- الوصول لأحرف النص
- تجزيء النص في بايثون بواسطة العامل []
- الرموز التي من خلالها نعرف نهاية السطر
- الدوال الجاهزة في الكلاس str
- العوامل التي تستخدم للتعامل مع النصوص
مفهوم النصوص
النص عبارة عن سلسلة من الأحرف ليس لها حجم محدد فقد يتألف من حرف واحد، كلمة، جملة أو فقرة كبيرة جداً.
في بايثون النص يندرج تحت النوع str.
في هذا الدرس ستتعرف على جميع الطرق التي يمكنك من خلالها تعريف نص، بالإضافة إلى الدوال الجاهزة التي يمكنك استخدامها للتعديل على النصوص، البحث فيها و تقطيعها.
النوع str يعتمد على الترميز UTF-8 و هذا يعني أنك لن تواجه أي مشكلة عند التعامل مع نصوص عربية، إنجليزية، فرنسية إلخ..
طريقة تعريف نص
لتعريف نص في بايثون يمكنك استخدام رمز التنصيص الفردي ' ' أو الزوجي " " و لا يوجد أي فارق بينهما.
- إذا كان النص يتألف من سطر واحد يمكن استخدام الرمز ' ' أو الرمز " ".
- إذا كان النص يتألف من عدة أسطر يمكن استخدام الرمز ''' ''' أو الرمز """ """.
المتغيرات النصية في بايثون تعتبر Immutable مما يعني أنه عند تعريف متغير و تخزين نص فيه فإنه سيتم حجز مكان له في الذاكرة مهما كان حجمه، و لكن إذا تم وضع قيمة جديدة في المتغير فإنه سيتم حجز مكان جديد لها في الذاكرة و وضع القيمة الجديدة فيه لأنه لا يمكن تعديل نفس القيمة في نفس المكان في الذاكرة.
بالنسبة لمساحة الذاكرة التي تم التخلي عنها فإنه سيتم حذفها بشكل تلقائي بعد مدة من قبل جامع القمامة ( Garbage Collector ).
في المثال التالي قمنا بتعريف ثلاث متغيرات تحتوي على قيم نصية.
لاحظ أننا قمنا بتعريف كل متغيير بواسطة رمز مختلف.
المثال الأول
النتيجة
Job: Programmer
Message: This string that will span across multiple lines. No need to use newline characters for the next lines.
The end of lines within this string is counted as a newline when printed.
في المثال التالي قمنا بتعريف نص يحتوي على نفس الرموز التي تستخدم لتعريف النصوص.
المثال الثاني
النتيجة
In this line we print "double quotations"
دمج النصوص
الدمج ( Concatenation ) معناه وضع سلسلة من الأشياء بجانب بعضها لتصبح كنص واحد.
تستطيع دمج نص مع نص و تستطيع دمج نص مع عدد.
عندما تقوم بإنشاء حساب جديد في أي موقع إلكتروني مثل هرمش، تلاحظ أنه يطلب منك أن تدخل إسمك ( First Name ) و يليه إسم عائلتك ( Last Name ). بعدها تلاحظ أنه يعرض إسمك الكامل ( Full Name ) مما يعني أنه دمج إسمك و إسم عائلتك مع بعض.
طرق دمج النصوص
يمكنك تطبيق الدمج في بايثون بثلاث طرق:
- الدمج التلقائي، إذا كان المراد دمج قيمتين نصيتين.
- إستخدام العامل + مما يتيح دمج نص مع نص أو نص مع عدد.
- إستخدام الدالة join() و التي تتيح دمج سلسلة من النصوص مع بعضها.
الدالة join() شرحنا طريقة استخدامها بشكل مفصل لاحقاً في هذا الدرس.
في المثال التالي قمنا بتعريف المتغير first_name لنضع فيه الإسم، و المتغير last_name لنضع فيه إسم العائلة، و المتغير full_name لنضع فيه الإسم و إسم العائلة.
المثال الأول
النتيجة
في حال وضعت قيمتين نصيّتين بجانب بعضهما و وضعت بينهما مسافة فارغة أو أكثر فإن مترجم بايثون سيقوم بدمجهمها كنص واحد بشكل تلقائي كما يلي.
المثال الثاني
النتيجة
الوصول لأحرف النص
لنفترض أننا قمنا بتعريف متغير إسمه s و قيمته النص 'welcome to harmash.com'
سيتم تخزين نص المتغير s في الذاكرة حرفاً حرفاً و بالترتيب كما في هذه الصورة التالية.
الوصول لأحرف النص من اليسار إلى اليمين
في حال أردت المرور على أحرف النص من الأول إلى الآخر (أي من اليسار إلى اليمين) فعليك استخدام أرقام أكبر أو تساوي 0 و هكذا سيتم إعتبار أن الخانات قد تم ترقيمها إبتداءاً من الرقم 0 كالتالي.
معلومة: ترقيم الخانات من الأول إلى الآخر يسمى Forward Indexing.
في المثال التالي سنقوم بطباعة أول 7 أحرف من الجهة اليسرى في النص و بالتالي سنحصل على الكلمة welcome.
مثال
النتيجة
الوصول لأحرف النص من اليمين إلى اليسار
في حال أردت المرور على أحرف النص من الآخر إلى الأول (أي من اليمين إلى اليسار) فعليك استخدام أرقام أصغر 0 و هكذا سيتم إعتبار أن الخانات قد تم ترقيمها إبتداءاً من الرقم 1- كالتالي.
معلومة: ترقيم الخانات من الآخر إلى الأول يسمى Backward Indexing.
في المثال التالي قمنا بطباعة محتوى آخر 3 أحرف من الجهة اليمنى و بالتالي سنحصل على الكلمة com.
مثال
النتيجة
معرفة عدد أحرف النص
لمعرفة عدد أحرف النص نقوم باستدعاء الدالة len() و نمرر لها النص فقط.
مثال
النتيجة
المسافات الفارغة ( White Spaces ) يتم حسابها كأحرف عادية.
مصطلحات تقنية
- عدد أحرف النص يسمى Length.
- رقم الخانة أو الفهرس يسمى Index.
- أرقام الخانات أو أرقام الفهرس تسمى Indices.
- إذا قمنا بأخذ جزء من النص فالجزء المأخوذ يسمى Substring.
تجزيء النص في بايثون بواسطة العامل []
لأخذ جزء من أي نص نعتمد على أرقام الخانات التي يتم إعطاءها لكل حرف في النص.
في المثال التالي قمنا بعرض جزء محدد من النص الذي يحتويه المتغير s.
فعلياً، حددنا أننا نريد عرض جميع الأحرف الموجودة ابتداءاً من الخانة رقم 11 وصولاً إلى ما قبل الخانة رقم 18.
المثال الأول
النتيجة
في المثال التالي قمنا بعرض جزء غير محدد من النص الذي يحتويه المتغير s.
فعلياً، حددنا أننا نريد عرض جميع الأحرف الموجودة ابتداءاً من الخانة رقم 11 وصولاً إلى آخر خانة.
المثال الثاني
النتيجة
في المثال التالي قمنا بعرض جزء غير محدد من النص الذي يحتويه المتغير s.
فعلياً، حددنا أننا نريد عرض جميع الأحرف الموجودة ابتداءاً من الخانة الأولى وصولاً إلى ما قبل الخانة رقم 11.
المثال الثالث
النتيجة
الرموز التي من خلالها نعرف نهاية السطر
الرمز الذي يتم وضعه للإشارة لنهاية السطر يختلف باختلاف أنواع التقنيات المستخدمة لحفظ البيانات التي نتعامل معها.
الرموز التالية كلها تعني نهاية السطر.
الرمز | معناه بالإنجليزية |
---|---|
\n | Line Feed |
\r | Carriage Return |
\r\n | Carriage Return + Line Feed |
\v or \x0b | Line Tabulation |
\f or \x0c | Form Feed |
\x1c | File Separator |
\x1d | Group Separator |
\x1e | Record Separator |
\x85 | Next Line (C1 Control Code) |
\u2028 | Line Separator |
\u2029 | Paragraph Separator |
في المثال التالي قمنا بتخزين نص في المتغير s وضعنا فيه ثلاث مؤشرات \n لجعل النص يظهر على ثلاث أسطر عند عرضه.
مثال
النتيجة
This is second line.
This is third line.
نلاحظ أن الرمز \n لا يظهر فعلياً بل يجعل ما يليه يظهر على سطر جديد فقط.
عندما تكون تستخدم هاتفك أو حاسوبك تقوم في العادة بالنقر على الزر Enter كلما أردت أن تنزل على سطر جديد.
سبب النزول على سطر جديد هو أنه قد تم إضافة رمز خاص بدون علمك في المكان الذي نقرت فيه على الزر Enter للإشارة إلى نهاية السطر. الرمز الذي يضافة يقال له مؤشر نهاية السطر ( End Of Line Flag ).
الدوال الجاهزة في الكلاس str
str هو كلاس جاهز في بايثون يحتوي على دوال كثيرة للتعامل مع محتوى النصوص سواء للبحث عن أحرف أو كلمات أو جمل، تجزيء النص، تغيير حالة الأحرف، دمج النصوص و غيرها.
سنقسم دوال الكلاس str إلى 5 فئات أساسية:
- دوال للبحث ( Searching ).
- دوال للتجزيء ( Substring ).
- دوال للتبديل ( Replacing ).
- دوال للمقارنة ( Comparison ).
- دوال للمعالجة ( Manipulation ).
معلومة تقنية
عند التعامل مع أي دالة من دول الكلاس str سواء كان شرح هذه الدالة يقول أن الدالة تبدأ من أول النص إلى آخره أو تبدأ من نهايته إلى أوله. تخيل دائماً أن خانات النص قد تم ترقيمها من اليسار إلى اليمن.
تذكر أن str يعتبر Immutable class و هذا يعني أنه عند استدعاء أي دالة منه، فلن تعدل محتوى النص الأصلي الذي قام باستدعائها بل سترجع نسخة معدلة من هذا النص و سيبقى النص الأصلي كما هو.
دوال البحث الموجودة في الكلاس str
إسم الدالة مع تعريفها | |
---|---|
1 | count(sub[, start[, end]])
تبحث في النص الذي قام باستدعائها عن النص الذي نمرره لها مكان الباراميتر sub ثم ترجع عدد المرات التي تم فيها العثور عليه. في حال لم يتم العثور على النص المراد البحث عنه فإنها ترجع 0. شاهد المثال |
2 | find(sub[, start[, end]])
تبحث في النص الذي قام باستدعائها عن رقم أول خانة يوجد عندها النص الذي نمرره لها مكان الباراميتر sub و ترجعه. في حال لم يتم العثور على النص المراد البحث عنه فإنها ترجع -1. شاهد المثال |
3 | rfind(sub[, start[, end]])
الفرق بينها و بين الدالة find() أنها تبدأ عملية البحث من آخر خانة في النص الذي قام باستدعائها إلى أول خانة فيه. شاهد المثال |
4 | index(sub[, start[, end]])
تبحث في النص الذي قام باستدعائها عن رقم أول خانة يوجد عندها النص الذي نمرره لها مكان الباراميتر sub و ترجعه. في حال لم يتم العثور على النص المراد البحث عنه ترمي الإستثناء ValueError. شاهد المثال |
5 | rindex(sub[, start[, end]])
الفرق بينها و بين الدالة index() أنها تبدأ عملية البحث من آخر خانة في النص الذي قام باستدعائها إلى أول خانة فيه. شاهد المثال |
دوال التجزيء الموجودة في الكلاس str
إسم الدالة مع تعريفها | |
---|---|
1 | split(sep=None, maxsplit=-1)
ترجع نسخة من النص الذي قام باستدعائها مقسمة على شكل مصفوفة نصوص. إفتراضياً، كل عنصر في هذه المصفوفة عبارة عن كلمة موجودة في النص. مكان الباراميتر sep يمكن تمرير الحرف أو النص الذي على أساسه سيتم تقسيم النص الذي قام باستدعائها. شاهد المثال |
2 | splitlines([keepends])
ترجع نسخة من النص الذي قام باستدعائها مقسمة على شكل مصفوفة نصوص. كل عنصر في هذه المصفوفة عبارة عن سطر موجود في النص. مكان الباراميتر keepends يمكن تمرير القيمة True لإبقاء الرموز التي من خلالها عرف مترجم بايثون كيف يفصل الأسطر عن بعضها و من ثم يضيف كل سطر كعنصر في المصفوفة. شاهد المثال |
دوال التبديل الموجودة في الكلاس str
إسم الدالة مع تعريفها | |
---|---|
1 | replace(old, new [, count])
ترجع نسخة من النص الذي قام باستدعائها مع تبديل كل جزئية فيها تتطابق مع النص نمرره لها مكان الباراميتر old بالنص الذي نمرره لها مكان الباراميتر new. شاهد المثال |
2 | maketrans(x[, y[, z]])
تستخدم لبناء قاموس يمكن إستخدامه لتبديل أحرف النص بأحرف أخرى. ملاحظة: من بعدها يجب استخدام الدالة translate() لتطبيق القاموس الذي تم تجهيزه على النص. شاهد المثال |
3 | translate(table)
ترجع نسخة من النص الذي قام باستدعائها مع تبديل بعض أحرف هذه النسخة بأحرف أخرى أو حذفها بالإعتماد على القاموس الذي نمرره لها مكان الباراميتر table. ملاحظة: القاموس الذي يتم تمريره لهذه الدالة يتم بناؤه بالأساس بواسطة الدالة str.maketrans(). شاهد المثال |
دوال المعالجة الموجودة في الكلاس str
إسم الدالة مع تعريفها | |
---|---|
1 | upper(s)
ترجع نسخة من النص الذي نمرره لها عند استدعائها مكان الباراميتر s كل أحرفه كبيرة. شاهد المثال |
2 | lower(s)
ترجع نسخة من النص الذي نمرره لها عند استدعائها مكان الباراميتر s كل أحرفه صغيرة. شاهد المثال |
3 | swapcase()
ترجع نسخة من النص الذي قام باستدعائها مع تحويل الأحرف الكبيرة فيها لأحرف صغيرة و الأحرف الصغيرة فيها لأحرف كبيرة. شاهد المثال |
4 | capitalize(s)
ترجع نسخة من النص الذي نمرره لها عند استدعائها مكان الباراميتر s مع تحويل أول حرف فيه لحرف كبير. إذاً، هذه الدالة مفيدة في حال أردنا أن نبدأ النص بحرف كبير. شاهد المثال |
5 | title(s)
ترجع نسخة من النص الذي نمرره لها عند استدعائها مكان الباراميتر s مع تحويل أول حرف من كل كلمة فيه لحرف كبير. إذاً، هذه الدالة مفيدة في حال أردنا عرض عنوان حيث يتم في العادة كتابة أول حرف من كل كلمة فيه كحرف كبير. شاهد المثال |
6 | join(iterable)
ترجع نص جديد يمثل النص الذي قام باستدعائها مدمجاً بالنص أو بمصفوفة النصوص التي نمرره لها مكان الباراميتر iterable. شاهد المثال |
7 | center(width[, fillchar])
تستخدم لعرض النص الذي قام باستدعائها في وسط السطر, في حال لم يتعدى الطول الذي نحدده للسطر. فعلياً, ترجع نسخة من النص و تضيف مسافات فارغة حوله عند الحاجة لجعله يظهر كأنه في المنتصف.
|
8 | expandtabs(tabsize=8)
ترجع نسخة من النص الذي قام باستدعائها مع مضاعفة حجم المسافات الفارغة ( Tab Spaces ) التي تم إضافتها في النص بواسطة الرمز \t. إفتراضياً, الرمز \t يمثل 4 مسافات فارغة عند عرض النص, و لكن في النسخة التي ترجعها الدالة expandtabs() سيتم تحويل كل رمز \t إلى 8 مسافات فارغة ما لم تقم بتحديد عدد المسافات بنفسك. شاهد المثال |
9 | lstrip()
ترجع نسخة من النص الذي قام باستدعائها مع إزالة أي مسافة فارغة موجودة في بدايته. شاهد المثال |
10 | rstrip()
ترجع نسخة من النص الذي قام باستدعائها مع إزالة أي مسافة فارغة موجودة في نهايته. شاهد المثال |
11 | strip([chars])
ترجع نسخة من النص الذي قام باستدعائها مع حذف أي مسافة فارغة موجودة في بدايته و نهايته. إفتراضياً, هذه الدالة تقوم بحذف المسافات الفارغة الموجودة في أول أو آخر النص لكن إن أردت مسح أحرف معينة ( بدلاً من المسافات الفارغة ) في حال وجودها في بداية و نهاية النص, يمكنك تمرير هذه الأحرف مكان الباراميتر chars. شاهد المثال |
12 | ljust(width[, fillchar])
ترجع نسخة من النص الذي قام باستدعائها مع إضافة مسافات فارغة في نهايته إذا تجاوز عدد أحرفه العدد الذي نمرره مكان الباراميتر width. و يمكنك تمرير أي حرف أو رمز مكان الباراميتر fillchar ليظهر بدلاً من المسافات الفارغة. شاهد المثال |
13 | rjust(width[, fillchar])
ترجع نسخة من النص الذي قام باستدعائها مع إضافة مسافات فارغة في بدايته إذا تجاوز عدد أحرفه العدد الذي نمرره مكان الباراميتر width. و يمكنك تمرير أي حرف أو رمز مكان الباراميتر fillchar ليظهر بدلاً من المسافات الفارغة. شاهد المثال |
دوال المقارنة الموجودة في الكلاس str في بايثون
إسم الدالة مع تعريفها | |
---|---|
1 | startswith(sub[, start[, end]])
تستخدم لمعرفة ما إذا كان النص الذي قام باستدعائها يبدأ بنص معين أم لا. مكان الباراميتر sub يمكنك تمرير نص عادي, أو مصفوفة نصوص نوعها tuple. في حال كان نص الباراميتر sub ( أو نص أحد عناصره في حال كان عبارة عن مصفوفة ) موجود في بداية النص الذي قام باستدعائها سترجع True. غير ذلك ترجع False. شاهد المثال |
2 | endswith(suffix[, start[, end]])
تستخدم لمعرفة ما إذا كان النص الذي قام باستدعائها ينتهي بنص معين أم لا. مكان الباراميتر suffix يمكنك تمرير نص عادي, أو مصفوفة نصوص نوعها tuple. في حال كان نص الباراميتر suffix ( أو نص أحد عناصره في حال كان عبارة عن مصفوفة ) موجود في نهاية النص الذي قام باستدعائها سترجع True. غير ذلك ترجع False. شاهد المثال |
3 | isalpha()
تستخدم لمعرفة ما إذا كان النص الذي قام باستدعائها يحتوي على حرف أبجدي أو مجموعة أحرف أبجدية فقط أم لا. ترجع True إن كان كذلك, غير ذلك ترجع False. ملاحظة: إسم هذه الدالة مشتق من الكلمة "Alphabet" التي تعني أحرف أبجدية. شاهد المثال |
4 | isnumeric()
تستخدم لمعرفة ما إذا كان النص الذي قام باستدعائها يحتوي على رقم أو مجموعة أرقام فقط أم لا. ترجع True إن كان كذلك, غير ذلك ترجع False. شاهد المثال |
5 | isdigit()
تستخدم لمعرفة ما إذا كان النص الذي قام باستدعائها يحتوي على رقم أو مجموعة أرقام فقط أم لا. ترجع True إن كان كذلك, غير ذلك ترجع False. ملاحظة: هذه الدالة لا تعتبر الرموز التي تمثل قيم رقمية مثل الرمز ½ كرقم و هذا هو الفرق بينها و بين الدالة isnumeric(). شاهد المثال |
6 | isalnum()
تستخدم لمعرفة نوع أحرف النص الذي قام باستدعائها.
شاهد المثال |
7 | islower()
تستخدم لمعرفة ما إذا كان النص الذي قام باستدعائها يحتوي فقط على أحرف أبجدية صغيرة (Small Letters) فقط أم لا. ترجع True إن كان كذلك, غير ذلك ترجع False. شاهد المثال |
8 | isupper()
تستخدم لمعرفة ما إذا كان النص الذي قام باستدعائها يحتوي فقط على أحرف أبجدية كبيرة (Capital Letters) فقط أم لا. ترجع True إن كان كذلك, غير ذلك ترجع False. شاهد المثال |
9 | istitle()
تستخدم لمعرفة ما إذا كان أول حرف من كل كلمة في النص الذي قام باستدعائها عبارة عن حرف كبير (Capital Letter) أم لا. ترجع True إن كان كذلك, غير ذلك ترجع False. شاهد المثال |
10 | isspace()
تستخدم لمعرفة ما إذا كان النص الذي قام باستدعائها يحتوي على مسافة فارغة (White Space) أو عدة مسافات فارغة فقط أم لا. ترجع True إن كان كذلك, غير ذلك ترجع False. شاهد المثال |
العوامل التي تستخدم للتعامل مع النصوص
العامل +
هذا العامل يستخدم لدمج نصّين أو أكثر و يرجعهم كنص جديد.
مثال
النتيجة
العامل *
هذا العامل يستخدم لتكرار النص عة مرات محددة.
مثال
النتيجة
العامل %
هذا العامل يستخدم لدمج النصوص و غالباً ما يستخدم أثناء عرض محتوى أي نص بطريقة مرتبة حيث يتم حجز مكان في النص للقيم التي تم تخزينها سابقاً في متغيرات.
مثال
النتيجة
I have 10 dollars.
I learn Programming at 19.
العامل in
هذا العامل يستخدم لمعرفة ما إن كان النص يحتوي على كلمة أو جملة معينة فيه, حيث يرجع True إن كان كذلك و False إن لم يكن.
مثال
النتيجة
False
العامل not in
هذا العامل يستخدم لمعرفة ما إن كان النص لا يحتوي على كلمة أو جملة معينة فيه, حيث يرجع True إن كان كذلك و False إن لم يكن.
مثال
النتيجة
True