8 النص
النص (str
) صف من الأحرف. وهو تسلسل ثابت من أرقام يونيكود (Unicode) التي هي رموز تتبع ترميزًا عالميًا يحوي جميع أحرف اللغات بالإضافة إلى علامات الترقيم والرسوم (مثل: 💡🔍📐) ونحوها.
8.1 النص الطبيعي
النص الطبيعي (الحر أو البشري) هو ما لا يتبع هيكلاً أو قالبًا يحكم طريقة كتابته؛ وهو يطول ويقصر من الحرف الواحد إلى مجموعة الأحرف إلى الكلمة إلى الجملة وإلى أكبر من ذلك نحو:
- محادثات وسائل التواصل الاجتماعي
- رسائل البريد الإلكتروني
- مقالات
- كتب
- موسوعات
- صفحات الشبكة
- مواقع الشبكة
وأوجه معالجة النصوص الحرة كثيرة منها: الفهرسة والبحث والاستبدال والعد والتصنيف والترتيب والقولبة …إلخ.
8.2 النص المُقَوْلَب
النص المقولَب الذي يأخذ شكلاً محددًا؛ وله صيغ متعددة يُنشئ الناس منها قوالب للنص لتمثل مجموعات أو ارتباطات من البيانات، كالجداول ونحوها.
وصيغ القولبة كثيرة من أشهرها: XML
, YAML
, JSON
, CSV
وهذا مثال لقالب بصيغة XML
:
والصيغة التي تستعمل كثيرًا لتمثيل الجداول (صفوف) هي صيغة CSV
. فكل سطرٍ هو صفٌّ في الجدول، وأوَّلُ سطرٍ هو رأس الجدول عادةً. وذلك على النحو التالي:
جرب أن تُنشئ ملفًّا نصيًّا وتكتب فيه ذلك وتحفظه بصيغة csv
ثم سترى أنه يمكنك فتحه بمحرر جداول (:مثل إكسل - Excel).
8.3 إنشاء النص
جملة إنشاء النص في بايثون تكون كالتالي:
- بعلامة اقتباس مفردة:
'السلام عليكم!'
- أو بعلامة اقتباس مزدوجة:
"السلام عليكم!"
وليس بينهما فرق. - أو بعلامة اقتاس مكررة ثلاثة مرات:
"""السلام عليكم!"""
للنص الجاري على أكثر من سطر.
على سبيل المثال:
تأمل إنشاء هذا النص الذي يبتدئ في السطر الأول ويتمد لأربعة أسطر:
message = """السلام عليكم ورحمة الله وبركاته,
أبشركم بأنكم قطعتم نصف المشوار.
شكرًا لكم.
أخوكم آدم.
"""
print(message)
السلام عليكم ورحمة الله وبركاته,
أبشركم بأنكم قطعتم نصف المشوار.
شكرًا لكم.
أخوكم آدم.
قراءة الملفات النصية
وكثيرًا ما يكون وجود النص في البرنامج ناتجًا عن قراءة ملف نصي بالفعل open()
وذلك بإضافة الحرف r
ميشرًا إلى أن غرض الفتح للقراءة:
وسيأتي تفصيل كيفية التعامل مع الملفات في باب الملفات.
8.4 الإشارة لجزء من النص
ولكون النص تسلسلاً ثابتًا فإنه يقبل جميع عمليات التسلسل السابق ذكرها (انظر باب المجموعة المرتبة).
0 1 2 3 4 5 6 7
+---+---+---+---+---+---+---+
| A | r | a | b | i | a | n |
+---+---+---+---+---+---+---+
-7 -6 -5 -4 -3 -2 -1
جرب
s[1:5]
s[1:5:2]
s[::2]
s[::-1]
لاحظ أن هذا يتحقق كما لو عرفنا صفًّا بالأحرف هذه نفسها:
لكن الفرق أن النص نوعٌ له أفعال / عمليات خاصة تتعلق بالنصوص.
8.5 النص ثابت لا يقبل التغير
فالنص تسلسل يشبه الصف في كوْنه ثابتًا (أي لا يقبل تعديل عنصر أو إضافته أو حذفه). فلو حاولت تغيير موضعٍ s[i]
في النص أو قطعة s[i:j]
فإنك ستواجه خطأ:
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) Cell In[5], line 2 1 s = 'Arabian' ----> 2 s[0] = 'a' TypeError: 'str' object does not support item assignment
لكننا لتعديل النص في الواقع نعيِّنُ إلى نفس المتغير نصًّا جديدًا منه:
لاحظ أننا أسندنا النص الجديد إلى المتغير s
، وهذا يعني أننا لم نعدل النص الأصلي بل أنشأنا نصًا جديدًا.
8.6 العمليات الخاصة بالنصوص
الاستبدال
لاستبدال جزء من النص، نستخدم فعل .replace()
:
إزالة المسافات
كما لدينا علميات .strip()
لإزالة المسافات البيضاء من بداية ونهاية النص.
البحث والمطابقة
وكذلك لدينا عمليات البحث:
- التحقق من البدء والنهاية وما بينهما:
.startswith(prefix)
و.endswith(suffix)
أوsub in string
وهي أعم. - لمعرفة موضع أول ظهور لسلسلة معيَّنة من الأحرف داخل النص
.find()
الفصل والوصل
- فصل النص لقائمة بناءً على جزء فاصل:
list.split(seperator)
- وصل عناصر القائمة في نص مفصول بجزء فاصل:
seperator.join(list)
أولاً: الفصل: مثاله قراءة سطر في ملف csv
إذْ القيم مفصولة بعلامة الفاصلة ,
:
ولقراءة الملف كاملاً نكرر:
- القيم في السطر الواحد مفصولة بعلامة الفاصلة
,
- والصفوف مفصولة بعلامة السطر الجديد
\n
لذلك سنستعمل الاثنين هنا:
csv = """name,age,city
Adam,25,Riyadh
Belal,30,Jeddah
Camal,35,Dammam"""
data = []
for line in csv.split(sep='\n'):
row = line.split(sep=',')
data.append(row)
print(data)
[['name', 'age', 'city'], ['Adam', '25', 'Riyadh'], ['Belal', '30', 'Jeddah'], ['Camal', '35', 'Dammam']]
ثانيًا: الوَصل: مثاله أننا نحول القائمة إلى نص مفصول بعلامة الفاصلة ,
وذلك ليكون سطرًا في ملف csv
:
عمليات إنجليزية
وهنا عمليات خاصة بالنصوص الإنجليزية:
upper()
نسخة ذات حروف كبيرة.lower()
نسخة ذات حروف صغيرة.capitalize()
نسخة ذات حرف أول كبير من كل كلمة.title()
نسخة ذات حالة عنوان.
name = 'Adam ibraheeM'
print(name.upper())
print(name.lower())
print(name.capitalize())
print(name.title())
ADAM IBRAHEEM
adam ibraheem
Adam ibraheem
Adam Ibraheem
وانظر مستندات النصوص لمعرفة كافة الأفعال الممكنة على النصوص.
تفسير الأرقام
تفسير الأرقام المكتوبة نصًّا تكثر الحاجة إليه خصوصًا عند قراءة ملفات أو التعامل مع بيانات من المستخدم، إذ يكون الإدخال نصيًّا:
int(x)
لتحويل نص إلى عدد صحيح.float(x)
لتحويل نص إلى عدد عشري.
لاحظ ناتج عملية جمع رقمين مكتوبين كنصوص:
الواجب تحويلهما إلى أعداد أولاًً:
8.7 إخراج النص
نستعرض ثلاث طرق لدمج النصوص في بايثون:
- الأولى: تحويل الشيء إلى نص قبل دمجه مع النص، باستعمال
str(x)
- الثانية: استعمال فراغات بالقوسين المعكوفين
{}
مع الفعل.format()
لاستبدالها. - الثالثة: استعمال
f-string
بأن تضع الحرفf
قبل علامة التنصيص الأولى، ليقبل النص وضع القيم مباشرة داخل الأقواس المعكوفة{}
. وهي الطريقة التي نفضلها.
name = "John"
lvl = 300
s1 = "I am " + name + " and I want to reach level " + str(lvl) # + operator
s2 = "I am {} and I want to reach level {}".format(name, lvl) # .format() method
s3 = f"I am {name} and I want to reach level {lvl}" # f-strings
assert s1 == s2 == s3
print(s1)
I am John and I want to reach level 300
يقبل النص التكرار بعلامة *
:
8.8 المحاذاة والحشو
طريقة ممتعة لتزيين سلسلة نصية باستخدام الفعل center
:
8.9 تنسيق الأرقام
محاذاة الأرقام
يمكننا أيضًا جعل كل من العدد n
والتعبئة p
متغيرات:
بشكل افتراضي، يتم محاذاة الرقم إلى اليمين. يمكننا محاذاته إلى اليسار بإضافة <
. لاحظ الفرق بين التعبيرين أدناه:
فاصل الآلاف
الترميز العلمي
الأعداد العشرية
10.5689
10.5689
10.57
11