مقایسه رشته‌ ها در پایتون

امیرحسین بیگدلو 4 ماه قبل

 

مقایسه دو رشته در پایتون

رشته‌های پایتون دنباله‌ای از کاراکترها هستند که به طور موثری به عنوان یک آبجکت در حافظه ذخیره میشوند. هر آبجکت را میتوان با متد ()id شناسایی کرد. پایتون از ایجاد شدن آبجکت‌هایی که مقادیر یکسانی دارند جلوگیری میکند. اگر برنامه نویس سعی کند دو آبجکت شبیه به هم ایجاد کند، فقط یک آبجکت در حافظه ذخیره شده و دو متغیر به آن آبجکت اشاره میکنند. این رفتار پایتون باعث میشود مقایسه آبجکت‌ها به سادگی قابل انجام باشد:

>>> a = "abc"
>>> b = "abc"
>>> c = "def"

>>> id(a)
139949123041320

>>> id(b)
139949123041320

>>> id(c)
139949122390576

 

در کد بالا سعی کردیم رشته 'abc' را در دو متغیر ذخیره کنیم. اما زمانی که با متد ()id بررسی کردیم، دیدیم که هر دوی این متغیرها یک عدد را نشان میدهند. از این رفتار میتوان فهمید که یک آبجکت در حافظه ذخیره شده و متغیر‌های a و b به آن آبجکت اشاره میکنند.

 

برای مقایسه stringها، پایتون چند عملگر مختلف دارد. در این مقاله ابتدا این عملگرها را بررسی میکنیم و سپس به سراغ ماژول‌های string و re میرویم. و در آخر از ماژول difflib برای مقایسه رشته‌های چندخطی استفاده میکنیم.

 

 

عملگرهای == و =! پایتون

ساده‌ترین عملگرهای پایتون برای مقایسه رشته‌ها == و =! هستند. از این عملگرها برای مقایسه اعداد نیز استفاده میشود. اگر دو رشته باهم کاملا برابر باشند، عملگر == مقدار True برمیگرداند اما اگر دو رشته با هم فرق داشته باشند False برمیگرداند. در مقابل، عملگر =! اگر دو رشته باهم برابر باشند False برمیگرداند اما اگر دو رشته با هم متفاوت باشند True برمیگرداند:

>>> 'amir' == 'amir'
True

>>> 'amir' == 'jack'
False

>>> 'amir' != 'ali'
True

 

 

دیگر عملگرهای مقایسه رشته‌ ها در پایتون

برای مقایسه رشته‌ها میتوانید از عملگرهایی مانند <, >, =< یا => نیز استفاده کنید. این عملگرها کاراکترها را با یکدیگر مقایسه میکنند. ترتیب کاراکترها براساس ترتیب حروف در الفبا است. دقت کنید که این مقایسه به کوچک یا بزرگ بودن حروف حساس است. به عنوان مثال Bus قبل از bus است:

>>> 'A' > 'a'
False

>>> 'x' < 'o'
False

>>> 'f' > 'Q'
True

 

 

استفاده از regex برای مقایسه رشته‌ ها در پایتون

regex تعدادی کاراکتر است که الگوی خاصی را مشخص میکند که میتوان برای مقایسه داده‌ها استفاده کرد. برای استفاده از regex در پایتون باید از ماژول re استفاده کنید. از این ماژول میتوانید متد compile را صدا بزنید. شما باید ابتدا الگویی که میخواهید را مشخص کنید. سپس با متد search رشته‌ را با الگو مطابقت میدهید. اگر الگو با رشته‌ ورودی مطابقت داشت، بخشی از رشته که مطابقت داشته را به شما میدهد در غیر اینصورت نتیجه‌ای نخواهد بود:

>>> import re

>>> pattern = re.compile('[Aa].')

>>> pattern.search('amir')
<re.Match object; span=(0, 2), match='am'>

>>> pattern.search('kevin')

 

 

استفاده از ماژول difflib برای مقایسه رشته‌ در پایتون

تا اینجای کار ما فقط کلمات یا حروف را با هم مقایسه کرده‌ایم. با استفاده از ماژول difflib میتوانید رشته‌های چند خطی یا لیستی از حروف را با هم مقایسه کنید. خروجی این ماژول را میتوانید براساس فرمت‌های خاصی سفارشی کنید.

 

در مثال بعد، چند رشته چندخطی را با هم مقایسه میکنیم. خروجی ماژول difflib تمام حذفیات و اضافات را نشان میدهد. برای مقایسه رشته‌ها با ماژول difflib، ابتدا باید از کلاس Diff یک آبجکت ساخته و با متد ()compare مقایسه را انجام دهید:

# import the additional module
import difflib
 
# define original text
# taken from: https://en.wikipedia.org/wiki/Internet_Information_Services
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."]

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

# initiate the Differ object
d = difflib.Differ()
 
# calculate the difference between the two texts
diff = d.compare(original, edited)
 
# output the result
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.

 

 

 #  نتیجه گیری

در این مقاله روش های مختلفی را برای مقایسه رشته ها در پایتون یاد گرفتید. امیدواریم این مرور کلی به شما در برنامه نویسی موثر کمک کند.

مطالب مشابه



مونگارد