از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
مقایسه رشته ها با استفاده از پایتون
سرفصلهای مطلب
در پایتون، رشته ها دنباله ای از کاراکترها هستند که به طور موثر در حافظه به عنوان یک شی ذخیره می شوند. هر شی را می توان با استفاده از id()
روش، همانطور که در زیر می بینید. پایتون سعی می کند از اشیایی در حافظه استفاده کند که دارای یک مقدار هستند، که همچنین باعث می شود مقایسه اشیاء در پایتون بسیار سریع باشد:
$ python
Python 3.9.0 (v3.9.0:9cf6752276, Oct 5 2020, 11:29:23)
(Clang 6.0 (clang-600.0.57)) روی 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()
به منظور مقایسه رشته ها، پایتون چند عملگر مختلف را برای انجام این کار ارائه می دهد. ابتدا در ادامه به توضیح بیشتر آنها می پردازیم. دوم، ما هر دو را بررسی خواهیم کرد string
و re
ماژولهایی که حاوی روشهایی برای رسیدگی به تطابقهای حساس به حروف بزرگ و نادرست هستند. سوم، برای مقابله با رشته های چند خطی difflib
مدول کاملا مفید است تعدادی مثال به شما در درک روش استفاده از آنها کمک می کند.
رشته ها را با عملگرهای == و != مقایسه کنید
به عنوان یک عملگر مقایسه اولیه که می خواهید از آن استفاده کنید ==
و !=
. آنها دقیقاً به همان روشی که با مقادیر صحیح و شناور کار می کنند. این ==
اپراتور برمی گرداند 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}")
اجرای اسکریپت پایتون از بالای خروجی به صورت زیر است:
$ 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
>>>
به محض تغییر مقدار، پایتون شی را مجدداً نمونهسازی میکند و متغیر را اختصاص میدهد. در قطعه کد بعدی b
مقدار 2 را می گیرد و متعاقباً b
و c
رجوع به همین مفعول شود:
>>> b = 'world'
>>> id(b)
140666888154416
>>> id(c)
140666888154416
اپراتورهای مقایسه بیشتر
برای مقایسه در مورد ترتیب واژگانی می توانید از عملگرهای مقایسه استفاده کنید <
، >
، <=
، و >=
. خود مقایسه شخصیت به شخصیت انجام می شود. ترتیب بستگی دارد روی ترتیب حروف الفبا این ترتیب بستگی دارد روی جدول کاراکترها در حال استفاده روی دستگاه شما در حین اجرای کد پایتون
به خاطر داشته باشید که ترتیب به حروف کوچک و بزرگ حساس است. به عنوان مثال برای الفبای لاتین، “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}")
اجرای اسکریپت پایتون از بالای خروجی به صورت زیر است:
$ python3 comparing-strings-order.py
Berlin comes before Lausanne
Paris comes after Lausanne
Lausanne is equal to Lausanne
مقایسه رشتههای غیر حساس به حروف بزرگ
مثال های قبلی متمرکز شد روی مطابقت دقیق بین رشته ها برای اجازه دادن به مقایسههای غیرحساس به حروف بزرگ، پایتون روشهای رشتهای خاصی مانند upper()
و lower()
. هر دوی آنها مستقیماً به عنوان متدهای شی رشته مطابق در دسترس هستند.
upper()
کل رشته را به حروف بزرگ تبدیل می کند و lower()
به ترتیب به حروف کوچک. مستقر روی لیست 1 لیست بعدی روش استفاده از lower()
روش.
لیست 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)
یک عبارت منظم – یا به اختصار “regex” – الگوی خاصی از کاراکترها را تعریف می کند.
برای استفاده از این مکانیسم در پایتون import را re
مدول اول و بعد یک الگوی خاص تعریف کنید. باز هم مثال زیر مبتنی است روی لیست 1. الگوی جستجو با “bay” مطابقت دارد و با حروف کوچک یا بزرگ شروع می شود. دقیقاً، کد پایتون زیر تمام رشتههایی را که الگوی جستجو در آنها انجام میشود، بدون توجه به موقعیت رشته – در ابتدا، یا در وسط یا در پایان، پیدا میکند.
لیست 4:
import re
listOfPlaces = ("Bayswater", "Table Bay", "Beijing", "Bombay")
pattern = re.compile("(Bb)ay")
for place in listOfPlaces:
if pattern.search(place):
print (f"{place} matches the search pattern")
خروجی به شرح زیر است و با “Bayswater”، “Table Bay” و “Bombay” از لیست مکان ها مطابقت دارد:
$ python3 comparing-strings-re.py
Bayswater matches the search pattern
Table Bay matches the search pattern
Bombay matches the search pattern
مقایسه چند خطی و فهرستی
تا کنون مقایسه های ما فقط بوده است روی چند کلمه. با استفاده از difflib
ماژول پایتون همچنین راهی برای مقایسه رشته های چند خطی و کل لیست کلمات ارائه می دهد. خروجی را می توان با توجه به فرمت های مختلف ابزارهای مختلف پیکربندی کرد.
مثال بعدی (لیست 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))
با اجرای اسکریپت خروجی مطابق شکل زیر ایجاد می شود. خطوط با حذف با نشان داده می شوند -
علائم در حالی که خطوط با اضافات با a شروع می شوند +
امضا کردن. علاوه بر این، خطوط دارای تغییرات با علامت سوال شروع می شوند. تغییرات با استفاده نشان داده شده است ^
در موقعیت مناسب علامت می دهد. خطوط بدون نشانگر همچنان یکسان هستند:
$ 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.
نتیجه
در این مقاله روش های مختلفی را برای مقایسه رشته ها در پایتون یاد گرفته اید. ما امیدواریم که این مرور کلی به شما کمک کند تا به طور موثر در زندگی توسعه دهنده خود برنامه ریزی کنید.
سپاسگزاریها
نویسنده مایل است از Mandy Neumeyer برای حمایت او در هنگام تهیه مقاله تشکر کند.
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-02 04:28:04