مقارنة الجمل باستخدام بايثون

في لغة بايثون ، السلاسل عبارة عن تسلسلات من الأحرف ، يتم تخزينها بشكل فعال في الذاكرة ككائن. يمكن تحديد كل كائن باستخدام id() الطريقة ، كما ترون أدناه. تحاول Python إعادة استخدام الكائنات في الذاكرة التي لها نفس القيمة ، مما يجعل أيضًا مقارنة الكائنات سريعًا جدًا في Python:

$ python
Python 3.9.0 (v3.9.0:9cf6752276, Oct  5 2020, 11:29:23) 
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a = "abc"
>>> b = "abc"
>>> c = "def"
>>> print (id(a), id(b), id(c))
(139949123041320, 139949123041320, 139949122390576)
>>> quit()

من أجل مقارنة السلاسل ، تقدم Python عددًا قليلاً من المشغلين المختلفين للقيام بذلك. أولاً ، سنشرحها بمزيد من التفصيل أدناه. ثانيًا ، سنستعرض كلاهما string و re الوحدات النمطية ، التي تحتوي على طرق للتعامل مع المطابقات غير الحساسة لحالة الأحرف وغير الدقيقة. ثالثًا ، للتعامل مع السلاسل متعددة الخطوط ، فإن وحدة difflib سهل جدا. سيساعدك عدد من الأمثلة على فهم كيفية استخدامها.

قارن Strngs بالعاملين == و! =

كعامل مقارنة أساسي سترغب في استخدامه == و !=. إنها تعمل بنفس الطريقة تمامًا كما هو الحال مع القيم الصحيحة والقيم العائمة. ال == يعود عامل التشغيل True إذا كان هناك تطابق تام ، وإلا False سيتم إرجاع. في المقابل ، فإن != يعود عامل التشغيل True إذا لم يكن هناك تطابق والعودة خلاف ذلك False. قائمة 1 يوضح هذا.

في باقة for حلقة ، سلسلة تحتوي على اسم المدينة السويسرية "لوزان" تتم مقارنتها بإدخال من قائمة أماكن أخرى ، ويتم طباعة نتيجة المقارنة على stdout.

قائمة 1:


listOfPlaces = ["Berlin", "Paris", "Lausanne"]
currentCity = "Lausanne"

for place in listOfPlaces:
    print (f"comparing {place} with {currentCity}: %{place == currentCity}")

تشغيل نص Python من أعلى الإخراج كما يلي:

$ python3 comparing-strings.py
comparing Berlin with Lausanne: False
comparing Paris with Lausanne: False
comparing Lausanne with Lausanne: True

== و is مشغلي

لدى بايثون عاملي المقارنة == و is. للوهلة الأولى يبدو أنهم متماثلون ، لكنهم في الواقع ليسوا كذلك.

== يقارن متغيرين بناءً على القيمة التي يمثلانها. في المقابل ، فإن is يقارن عامل التشغيل بين متغيرين بناءً على معرف الكائن في الذاكرة.

جون (دو) وجون (مو) كلاهما يسمى جون. إذا تمكنا من اختزالهم إلى أسمائهم فقط ، فسيكونون متساويين في القيمة ، لكن لا يزال هناك شخصان مختلفان من الناحية النوعية.

يوضح المثال التالي ذلك لثلاثة متغيرات ذات قيم سلسلة. المتغيرين a و b لها نفس القيمة ، وتشير بايثون إلى نفس الكائن لتقليل استخدام الذاكرة.

يتم إجراء ذلك للأنواع والسلاسل البسيطة افتراضيًا ، ولكن ليس للكائنات الأخرى:

>>> a = 'hello'
>>> b = 'hello'
>>> c = 'world'
>>> a is b
True
>>> a is c
False
>>> id(a)
140666888153840
>>> id(b)
140666888153840
>>> 

بمجرد أن تتغير القيمة ، ستعيد Python الكائن وتعيين المتغير. في مقتطف الرمز التالي b يحصل على قيمة 2 ، وبعد ذلك b و c الرجوع إلى نفس الكائن:

>>> b = 'world'
>>> id(b)
140666888154416
>>> id(c)
140666888154416

المزيد من عوامل المقارنة

للمقارنة فيما يتعلق بترتيب معجمي ، يمكنك استخدام عوامل المقارنة <, >, <=و >=. المقارنة نفسها تتم حرفًا بحرف. الترتيب يعتمد على ترتيب الحروف في الأبجدية. يعتمد هذا الترتيب على جدول الأحرف المستخدم على جهازك أثناء تنفيذ كود Python.

ضع في اعتبارك أن الترتيب حساس لحالة الأحرف. كمثال للأبجدية اللاتينية ، تأتي كلمة "Bus" قبل "bus". قائمة 2 يوضح كيف تعمل عوامل المقارنة هذه في الممارسة.

قائمة 2:


listOfPlaces = ["Berlin", "Paris", "Lausanne"]
currentCity = "Lausanne"

for place in listOfPlaces:
    if place < currentCity:
            print (f"{place} comes before {currentCity}")
    elif place > currentCity:
            print (f"{place} comes after {currentCity}")
    else:
            print (f"{place} is equal to {currentCity}")

تشغيل نص Python من أعلى الإخراج كما يلي:

$ python3 comparing-strings-order.py
Berlin comes before Lausanne
Paris comes after Lausanne
Lausanne is equal to Lausanne

مقارنات السلاسل غير الحساسة لحالة الأحرف

ركزت الأمثلة السابقة على التطابقات التامة بين السلاسل. للسماح بإجراء مقارنات غير حساسة لحالة الأحرف ، تقدم Python أساليب سلسلة خاصة مثل upper() و lower(). كلاهما متاح مباشرة كطرق لكائن سلسلة وفقا.

upper() يحول السلسلة بأكملها إلى أحرف كبيرة ، و lower() إلى أحرف صغيرة ، على التوالي. مرتكز على قائمة 1 القائمة التالية توضح كيفية استخدام lower() الأسلوب.

تحقق من دليلنا العملي العملي لتعلم Git ، مع أفضل الممارسات ، والمعايير المقبولة في الصناعة ، وورقة الغش المضمنة. توقف عن أوامر Googling Git وفي الواقع تعلم ذلك!

قائمة 3:


listOfPlaces = ["Berlin", "Paris", "Lausanne"]
currentCity = "lausANne"

for place in listOfPlaces:
    print (f"comparing {place} with {place.lower() == currentCity.lower()}: {currentCity}")

الإخراج كما يلي:

$ python3 comparing-strings-case-insensitive.py
comparing Berlin with lausANne: False
comparing Paris with lausANne: False
comparing Lausanne with lausANne: True

مقارنة السلاسل باستخدام التعبيرات العادية (RegEx)

A منتظم التعبير - أو "regex" للاختصار - يحدد نمطًا معينًا من الأحرف.

للاستفادة من هذه الآلية في Python ، قم باستيراد ملف re وحدة أولاً وتحديد نمط معين ، بعد ذلك. مرة أخرى ، يعتمد المثال التالي على قائمة 1. يطابق نمط البحث "bay" ، ويبدأ بحرف صغير أو كبير. على وجه التحديد ، يعثر رمز Python التالي على جميع السلاسل التي يحدث فيها نمط البحث بغض النظر عن موضع السلسلة - في البداية أو في المنتصف أو في النهاية.

قائمة 4:


import re


listOfPlaces = ["Bayswater", "Table Bay", "Bejing", "Bombay"]


pattern = re.compile("[Bb]ay")

for place in listOfPlaces:
    if pattern.search(place):
        print (f"{place} matches the search pattern")

الإخراج كالتالي ، ويتطابق مع "بايزووتر" و "تيبل باي" و "بومباي" من قائمة الأماكن:

$ python3 comparing-strings-re.py
Bayswater matches the search pattern
Table Bay matches the search pattern
Bombay matches the search pattern

مقارنات متعددة الأسطر والقوائم

حتى الآن كانت مقارناتنا على بضع كلمات فقط. باستخدام difflib توفر وحدة Python أيضًا طريقة لمقارنة سلاسل متعددة الأسطر وقوائم كاملة من الكلمات. يمكن تكوين الإخراج وفقًا للتنسيقات المختلفة لأدوات الفروق.

المثال التالي (قائمة 5) يقارن بين سلسلتين متعددتي الأسطر سطرًا بسطر ، ويعرض عمليات الحذف بالإضافة إلى الإضافات. بعد تهيئة ملف Differ الكائن في السطر 12 يتم إجراء المقارنة باستخدام compare() الطريقة في السطر 15. تتم طباعة النتيجة على الإخراج القياسي:


import difflib
 


original = ["About the IIS", "", "IIS 8.5 has several improvements related", "to performance in large-scale scenarios, such", "as those used by commercial hosting providers and Microsoft's", "own cloud offerings."]


edited = ["About the IIS", "", "It has several improvements related", "to performance in large-scale scenarios."]


d = difflib.Differ()
 

diff = d.compare(original, edited)
 

print ('n'.join(diff))

يؤدي تشغيل البرنامج النصي إلى إنشاء الإخراج كما هو موضح أدناه. يشار إلى السطور التي تم حذفها بالرمز - علامات بينما الخطوط مع الإضافات تبدأ ب + لافتة. علاوة على ذلك ، تبدأ الأسطر التي بها تغييرات بعلامة استفهام. يشار إلى التغييرات باستخدام ^ علامات في الموضع المناسب. الخطوط بدون مؤشر لا تزال كما هي:

$ python comparing-strings-difflib.py
  About the IIS
  
- IIS 8.5 has several improvements related
?  ^^^^^^

+ It has several improvements related
?  ^

- to performance in large-scale scenarios, such
?                                        ^^^^^^

+ to performance in large-scale scenarios.
?                                        ^

- as those used by commercial hosting providers and Microsoft's
- own cloud offerings.

وفي الختام

لقد تعلمت في هذه المقالة طرقًا مختلفة لمقارنة السلاسل في بايثون. نأمل أن تساعدك هذه النظرة العامة على البرمجة بشكل فعال في حياة مطور برامجك.

شكر وتقدير

تود الكاتبة أن تشكر ماندي نويمير على دعمها أثناء إعداد المقال.

الطابع الزمني:

اكثر من ستاكابوز