تغییرات اخیر

در اینجا اطلاعیه‌ها، نسخه‌ها و تغییرات جدید لیارا فهرست می‌شوند.

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

خلاصه کنید:

openaigeminiperplexity

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

در این مقاله از بلاگ لیارا می‌خواهیم روش‌های مختلف مقایسه دو رشته در پایتون را همراه با مثال‌های آن توضیح دهیم. با لیارا همراه باشید.

آنچه در این مقاله می‌خوانید:

  • مقایسه رشته‌ها در پایتون
  • برابری رشته‌ها بدون حساسیت به حروف
  • رشته‌ها با کاراکترهای خاص
  • تفاوت ==، lower() و casefold() در پایتون
  • چرا از is برای رشته‌ها استفاده نکنیم؟
  • مقایسه رشته‌ها و یونیکد
  • اشتباهات رایج در مقایسه رشته‌ها
  • نکات پیشرفته مقایسه رشته‌ها
  • راهنمای سریع برابری رشته‌ها
  • سوالات متداول
  • جمع بندی
مقایسه دو رشته در پایتون: روش‌ها و مثال‌ها

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

در ابتدای این آموزش بیایید چند مثال عملی ببینیم تا بررسی کنیم دو رشته با هم برابر هستند یا نه.

s1 = 'Apple'
s2 = 'Apple'
s3 = 'apple'

# case sensitive equals check
if s1 == s2:
    print(f"s1 and s2 are equal: {s1 == s2}")

if s1.__eq__(s2):
    print(f"s1 and s2 are equal: {s1.__eq__(s2)}")

همچنین، می‌توانید مقایسه رشته‌ها را داخل یک تابع (function) نیز قرار دهید:

def compare_strings(a: str, b: str) -> None:
    print(f"{a!r} == {b!r}: {a == b}")
    print(f"{a!r} != {b!r}: {a != b}")

compare_strings(s1, s2)
compare_strings(s1, s3)

خروجی به صورت زیر خواهد بود:

s1 and s2 are equal.
s1 and s2 are equal.

اگر می‌خواهید بررسی کنید که دو رشته باهم برابر نیستند، می‌توانید از عملگر != استفاده کنید.

if s1 != s3:
    print(f"s1 and s3 are not equal: {s1 != s3}")
Output: s1 and s3 are not equal: True
با هاست پایتون لیارا، اپلیکیشن‌های Python خود را روی بستر سریع، پایدار و امن اجرا کن.
✅ نصب فوری✅ منابع اختصاصی✅ دسترسی کامل SSH
خرید و راه‌اندازی هاست پایتون

برابری رشته‌ها بدون حساسیت به حروف

گاهی اوقات هنگام مقایسه دو رشته، حساسیت به حروف بزرگ و کوچک مهم نیست. در این حالت می‌توانید از توابع casefold()، lower() یا upper() برای بررسی برابری بدون توجه به حروف استفاده کنید.

if s1.casefold() == s3.casefold():
    print(f"s1.casefold(): {s1.casefold()}")
    print(f"s3.casefold(): {s3.casefold()}")
    print(f"s1 and s3 are equal in case-insensitive comparison: {s1.casefold() == s3.casefold()}")

if s1.lower() == s3.lower():
    print(f"s1.lower(): {s1.lower()}")
    print(f"s3.lower(): {s3.lower()}")
    print(f"s1 and s3 are equal in case-insensitive comparison: {s1.lower() == s3.lower()}")

if s1.upper() == s3.upper():
    print(f"s1.upper(): {s1.upper()}")
    print(f"s3.upper(): {s3.upper()}")
    print(f"s1 and s3 are equal in case-insensitive comparison: {s1.upper() == s3.upper()}")

خروجی:

apple
apple
s1 and s3 are equal in case-insensitive comparison
apple
apple
s1 and s3 are equal in case-insensitive comparison
APPLE
APPLE
s1 and s3 are equal in case-insensitive comparison

رشته‌ها با کاراکترهای خاص

بیایید چند مثال بررسی کنیم که رشته‌ها شامل کاراکترهای خاص هستند.

s1 = '$#ç∂'
s2 = '$#ç∂'

print(f"s1 == s2? {s1 == s2}")
print(f"s1 != s2? {s1 != s2}")
print(f"s1.lower() == s2.lower()? {s1.lower() == s2.lower()}")
print(f"s1.upper() == s2.upper()? {s1.upper() == s2.upper()}")
print(f"s1.casefold() == s2.casefold()? {s1.casefold() == s2.casefold()}")

خروجی:

s1 == s2? True
s1 != s2? False
s1.lower() == s2.lower()? True
s1.upper() == s2.upper()? True
s1.casefold() == s2.casefold()? True
هاست پایتون چیست؟ + راهنمای کامل خرید هاست Python
هاست پایتون

تفاوت ==، lower() و casefold() در پایتون

عملگر == بررسی برابری دقیق رشته‌ها را انجام می‌دهد و به حروف بزرگ و کوچک حساس است. در مقابل، توابع .lower() و .casefold() برای مقایسه بدون حساسیت به حروف استفاده می‌شوند. تفاوت اصلی این است که .lower() برای همه کاراکترهای یونیکد مناسب نیست، اما .casefold() کامل‌تر است.

مثال:

s1 = 'Apple'
s2 = 'apple'

# Using ==
print(s1 == s2)  # Output: False

# Using .lower()
print(s1.lower() == s2.lower())  # Output: True

# Using .casefold()
print(s1.casefold() == s2.casefold())  # Output: True

چرا از is برای رشته‌ها استفاده نکنیم؟

عملگر is برای بررسی هویت شیء (object identity) استفاده می‌شود، نه برابری محتوا. بنابراین استفاده از is برای مقایسه رشته‌ها مناسب نیست و ممکن است نتایج غیرمنتظره بدهد. برای مقایسه رشته‌ها همیشه از == استفاده کنید.

مثال:

s1 = 'Hello'
s2 = 'Hello'

# Using is
print(s1 is s2)  # Output: True, but this checks object identity, not equality

# Using ==
print(s1 == s2)  # Output: True, this checks for equality

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

هنگام مقایسه رشته‌ها که شامل کاراکترهای ویژه یا یونیکد هستند، باید روش مناسب را انتخاب کنید. برای مقایسه بدون حساسیت به حروف از .casefold() استفاده کنید و برای مقایسه حساس به حروف از ==.

مثال:

s1 = 'ççç'
s2 = 'ÇÇÇ'

# Case-sensitive comparison using ==
print(s1 == s2)  # Output: False

# Case-insensitive comparison using .casefold()
print(s1.casefold() == s2.casefold())  # Output: True

اشتباهات رایج در مقایسه رشته‌ها

استفاده از is به جای == برای مقایسه رشته‌ها

این یک اشتباه رایج در پایتون است. عملگر is هویت شیء (object identity) را بررسی می‌کند و نه برابری محتوا. برای مقایسه رشته‌ها همیشه از == استفاده کنید.

نمونه کاربرد اشتباه is:

s1 = 'Hello'
s2 = 'Hello'
print(s1 is s2)  # This will return True if s1 and s2 refer to the same object, not if they have the same value.

کد اصلاح شده:

s1 = 'Hello'
s2 = 'Hello'
print(s1 == s2)  # This will return True if s1 and s2 have the same value.

مقایسه رشته با None یا انواع غیررشته‌ای

هنگام مقایسه یک رشته با None یا داده‌های غیررشته‌ای، پایتون خطای TypeError می‌دهد. برای جلوگیری از این مشکل، مطمئن شوید که رشته‌ها را فقط با رشته‌های دیگر یا به‌صورت صریح با None مقایسه می‌کنید.

نمونه کاربرد اشتباه is:

s1 = 'Hello'
s2 = None
print(s1 == s2)  # This will raise a TypeError because s2 is not a string.

کد اصلاح شده:

s1 = 'Hello'
s2 = None
if isinstance(s2, str):
    print(s1 == s2)
else:
    print("s2 is not a string.")

نتایج اشتباه به‌خاطر فاصله‌های اضافی در رشته

وجود فاصله‌های اضافه در ابتدا یا انتهای رشته می‌تواند باعث نتایج نادرست هنگام مقایسه شود. برای رفع این مشکل، قبل از مقایسه از متد strip() استفاده کنید تا فاصله‌های اضافی حذف شوند.

نمونه کاربرد اشتباه is:

s1 = 'Hello'
s2 = ' Hello '
print(s1 == s2)  # This will return False because of the leading and trailing whitespace in s2.

کد اصلاح شده:

s1 = 'Hello'
s2 = ' Hello '
print(s1 == s2.strip())  # This will return True after removing the leading and trailing whitespace from s2.

تطبیق اشتباه انکدینگ

متن‌ها گاهی از فایل‌ها، پایگاه داده یا APIها با انکودینگ اشتباه یا نامشخص می‌آیند. مقایسه رشته‌ای که با UTF‑8 و رشته‌ای که با Latin‑1 دیکد شده باشد، ممکن است همیشه شکست بخورد، حتی اگر ظاهر مشابه داشته باشند. همیشه از UTF‑8 استفاده کنید و در صورت خطای دیکد، سریع برخورد کنید.

raw = b"Stra\xc3\x9fe"     # UTF-8 bytes for "Straße"
wrong = raw.decode('latin-1') # Mis-decoded
right = raw.decode('utf-8')   # Correct
print(wrong == right)          # False
print(wrong.encode('latin-1').decode('utf-8') == right)  # True after repair

کاراکترهای یونیکد مخفی

کاراکترهای نامرئی مانند Zero‑Width Space (ZWSP \u200b)، BOM (\ufeff) یا Zero‑Width Joiner/Non‑Joiner ممکن است هنگام کپی/پیست، فرم‌های وب یا PDFها وارد متن شوند. این کاراکترها می‌توانند مقایسه، مرتب‌سازی و حذف تکراری‌ها را مختل کنند. برای شناسایی، کد پوینت‌ها یا طول رشته را بررسی کنید و آن‌ها را هنگام پاک‌سازی ورودی حذف کنید. برای عیب‌یابی بهتر، مقادیر اصلی و پاک‌شده را جداگانه ثبت کنید.

s = "hello\u200bworld"  # visually "helloworld"
print(len("helloworld"), len(s))  # 10 vs 11
print("helloworld" == s)          # False
CLEAN = ''.join(ch for ch in s if ch not in "\u200b\u200c\u200d\ufeff")
print("helloworld" == CLEAN)      # True

نرمال‌سازی رشته‌ها با unicodedata.normalize

کاراکترهای ظاهراً یکسان ممکن است در حافظه متفاوت باشند (حروف پیش‌ساخته در مقابل ترکیبی). نرمال‌سازی آن‌ها را به یک فرم استاندارد تبدیل می‌کند تا مقایسه معنی‌دار باشد. برای مقایسه سازگار از NFKC استفاده کنید و زمانی که حفظ فرم اصلی متن مهم است، از NFC بهره ببرید. پس از نرمال‌سازی، اگر نیاز به مقایسه بدون حساسیت به حروف دارید، از casefold() استفاده کنید. بهتر است نرمال‌سازی را یک‌بار در نقاط ورودی اعمال کنید تا هزینه اضافی ایجاد نشود.

import unicodedata

s1 = "e\u0301"        # "e" + combining acute
s2 = "é"              # precomposed
print(s1 == s2)        # False in raw form
n1 = unicodedata.normalize('NFKC', s1)
n2 = unicodedata.normalize('NFKC', s2)
print(n1 == n2)        # True after normalization
print(n1.casefold() == n2.casefold())  # Robust, case-insensitive

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

روش (Practice)توضیح (Description)نمونه کد (Code Example)زمان استفاده (When to Use)
نرمال‌سازی در نقاط ورودیتبدیل متن به فرم استاندارد قبل از مقایسهunicodedata.normalize('NFKC', s).strip().casefold()برای متون قابل مشاهده توسط کاربر، اگر حفظ صحت داده مهم است، از NFC استفاده کنید
یکسان‌سازی انکودینگیک انکودینگ مشخص (UTF-8) انتخاب و روی تمام ورودی/خروجی اعمال کنیدtext.encode('utf-8').decode('utf-8')برای تمام ورودی‌ها و خروجی‌ها؛ هنگام بروز خطا در decode، سریع متوقف شوید
حذف کاراکترهای نامرئیقبل از مقایسه، کاراکترهای ZWSP/ZWNJ/ZWJ/BOM را حذف کنید''.join(ch for ch in s if ch not in "\u200b\u200c\u200d\ufeff")زمانی که معنا مهم است و حذف کاراکترهای فرمت اضافی ضروری است
ثبات نوع داده‌هاهرگز bytes و str را مخلوط نکنید؛ decode/encode صریح انجام دهیدb.decode('utf-8') == sهمیشه؛ قبل از مقایسه، بایت‌ها را به رشته تبدیل کنید
پیش‌نرمال‌سازی یک‌بارمتن را یک بار تبدیل کنید و سپس چندین بار مقایسه انجام دهیدnormalized = text.casefold(); normalized == targetحلقه‌های پردازش سریع، validators، و کارهای ETL
استفاده از casefold() به جای lower()از تبدیل حروف حساس به یونیکد استفاده کنیدs1.casefold() == s2.casefold()مقایسه بدون حساسیت به حروف برای یونیکد
ثبت مقادیر خام و نرمال‌شدهمقادیر اصلی و پردازش‌شده را برای رفع اشکال نگه داریدlogger.debug("Raw: {raw}, Canonical: {canonical}")هنگام دیباگ برای جلوگیری از حذف داده‌های اصلی
مقایسه فرم‌های دقیق استانداردفرم‌های دقیق متن را مقایسه کنید و از رفتار وابسته به لوکال جلوگیری کنیدunicodedata.normalize('NFC', s)مسیرهای حساس به امنیت

نکات پیشرفته مقایسه رشته‌ها

یونیکد (استفاده از casefold() به جای lower())

وقتی در محیط‌های چندزبانه (آلمانی، ترکی، حروف لاتین با اکسنت) کار می‌کنید، lower() ممکن است به‌درستی عمل نکند. مثال: ß در آلمانی باید با ss برابر باشد و İ در ترکی به "i\u0307" تبدیل می‌شود، نه صرفاً i. casefold() تبدیل قوی‌تر و آگاه به یونیکد انجام می‌دهد که با انتظار کاربران و معنای جستجو بهتر هم‌خوانی دارد. خلاصه: اگر داده‌ها یا کاربران شما صرفاً ASCII نیستند، از casefold() استفاده کنید.

s1 = "straße"
s2 = "STRASSE"
print(s1.lower() == s2.lower())      # False on many systems
print(s1.casefold() == s2.casefold()) # True: "straße" → "strasse"

s3 = "İstanbul"   # Capital dotted I
s4 = "istanbul"
print(s3.lower() == s4)               # Often False: "İ" → "i\u0307"
print(s3.casefold() == s4)            # More reliable for Unicode text

چگونه مقایسه رشته‌ها را در برنامه‌های بزرگ سریع‌تر کنیم؟

بررسی برابری رشته‌ها دارای پیچیدگی O(n)O(n)O(n) بر اساس طول رشته است؛ خود عملگر سریع است، اما وقتی در حلقه‌های پرتکرار، اعتبارسنج‌ها یا فرآیندهای ETL مکرراً استفاده شود، هزینه آن جمع می‌شود.

import timeit

# Naïve: transform inside the loop
setup = "a='Straße'; b='STRASSE'"
naive = timeit.timeit("a.casefold()==b.casefold()", setup=setup, number=2_000_000)

# Better: precompute once, compare many times
setup2 = "a='Straße'.casefold(); b='STRASSE'.casefold()"
optimized = timeit.timeit("a==b", setup=setup2, number=2_000_000)

print({"naive_s": naive, "optimized_s": optimized})  # Optimized is typically faster

بایت‌ها در مقابل رشته‌ها

در پایتون، str و bytes نوع‌های متفاوتی هستند. مقایسه مستقیم بین آن‌ها همیشه False برمی‌گرداند، حتی اگر کاراکترهای قابل مشاهده یکسان باشند. همچنین، استفاده‌ی ترکیبی از انکودینگ‌های مختلف می‌تواند باگ‌های ظریف و غیرمنتظره ایجاد کند.

b = b"hello"
s = "hello"
print(b == s)               # False: bytes vs str
print(b.decode('utf-8') == s)   # True: decode to text first

payload = b"Stra\xc3\x9fe"  # UTF-8 for "Straße"
text = payload.decode('utf-8')
print(text.casefold() == "strasse")  # True

الگوهای واقعی برای رفع باگ‌ها

داده‌های واقعی در محیط تولید اغلب شامل نمادهای نامرئی هستند، مثل فضاهای بدون عرض، فاصله‌های غیرقابل شکستن و فرم‌های نرمال‌سازی متفاوت یونیکد.

برای مقایسه‌ی درست، بهتر است این مراحل را انجام دهید:

  • حذف فاصله‌ها و کاراکترهای نامرئی
  • نرمال‌سازی یونیکد
  • مقایسه رشته‌ها (معمولاً با casefold())
import re, unicodedata

ZW_INVISIBLES = "\u200b\u200c\u200d\ufeff"  # ZWSP, ZWNJ, ZWJ, BOM

def canonicalize(s: str) -> str:
    s = ''.join(ch for ch in s if ch not in ZW_INVISIBLES)
    s = unicodedata.normalize('NFKC', s)
    return s.strip().casefold()

api_val = "  Stra\u00dfe\u200b  "    # "Straße" + zero-width space + padding
user_val = "strasse"
print(canonicalize(api_val) == canonicalize(user_val))  # True

کاراکترهای مشابه و خطرات امنیتی

یونیکد شامل بسیاری از کاراکترهای مشابه (confusable) است، حروف و اعدادی که تقریباً شبیه هم به نظر می‌رسند اما کدپوینت‌های متفاوت دارند. مهاجمان می‌توانند از این ویژگی برای جعلی‌سازی دامنه‌ها، نام‌های کاربری و فیشینگ استفاده کنند

مثال‌ها:

  • حرف سیریلیک “а” (U+0430) و حرف لاتین “a” (U+0061) از نظر بصری یکسان به نظر می‌رسند.
  • ترکیب “rn” شبیه حرف “m” دیده می‌شود.

برای محافظت:

  • همیشه رشته‌ها را نرمال‌سازی کنید.
  • استفاده از مکانیزم‌های امنیتی یونیکد برای شناسایی کاراکترهای مشابه.

این اقدامات کمک می‌کنند تا از سوءاستفاده‌های مخفی و حملات فیشینگ جلوگیری شود.

import unicodedata

# Cyrillic 'а' (U+0430) vs Latin 'a'
latin = "apple"
cyrillic = "аpple"  # first 'a' is Cyrillic
print(latin == cyrillic)  # False, but looks identical
print([ord(c) for c in cyrillic])  # [1072, 112, 112, 108, 101]

# 'rn' vs 'm'
print("rn" == "m")  # False, but can look similar in some fonts
بهترین کتابخانه‌های پایتون برای هوش مصنوعی
کتابخانه‌ برای هوش مصنوعی

راهنمای سریع برابری رشته‌ها

جدول زیر روش‌های اصلی مقایسه رشته‌ها در پایتون را خلاصه می‌کند.

روشتوضیح و توصیه کارشناسی
== (برابری)برای اکثر موارد توصیه می‌شود. مقدار دو رشته را کاراکتر به کاراکتر مقایسه می‌کند. سریع است (O(n)) و در CPython بهینه شده. برای ASCII و یونیکد قابل اعتماد است، به شرطی که ابتدا ورودی‌ها را استانداردسازی کنید (حذف فاصله‌ها، نرمال‌سازی یونیکد، casefold اگر لازم بود). از فرضیات وابسته به locale خودداری کنید. در برنامه‌های حساس (احراز هویت، حذف رکوردهای تکراری، اعتبارسنجی داده)، همیشه قبل از == ورودی‌ها را canonicalize کنید.
is (هویت)برای مقایسه محتویات رشته‌ها استفاده نشود. فقط بررسی می‌کند که آیا دو متغیر به همان شیء در حافظه اشاره دارند یا نه. ممکن است برای رشته‌های کوتاه به خاطر string interning کار کند، اما قابل اعتماد نیست. is فقط برای بررسی تک‌نمونه‌ها مثل x is None مناسب است. برای مقایسه محتویات همیشه از == استفاده کنید.
.lower()مقایسه‌ی ساده بدون حساسیت به حروف برای ASCII. تمام حروف بزرگ را به کوچک تبدیل می‌کند. برای موارد انگلیسی ساده مناسب است اما آگاه به یونیکد نیست. کاراکترهایی مثل آلمانی ß یا ترکی İ به درستی مدیریت نمی‌شوند. برای برنامه‌های چندزبانه یا بین‌المللی کافی نیست—به جای آن .casefold() استفاده کنید.
.casefold()بهترین روش برای مقایسه بدون حساسیت به حروف و آگاه به یونیکد. از .lower() قوی‌تر است و موارد پیچیده مثل ß→ss یا dotted/dotless I را مدیریت می‌کند. برای حداکثر اطمینان، آن را همراه با نرمال‌سازی یونیکد (unicodedata.normalize) استفاده کنید تا رشته‌هایی که از نظر بصری یکسان هستند واقعاً برابر در نظر گرفته شوند. کمی کندتر از .lower() است اما برای کد مقاوم و جهانی ضروری است.
Regex (re.fullmatch)برای مقایسه ساده توصیه نمی‌شود. عبارات منظم برای اعتبارسنجی و الگوهای پیچیده قدرتمند هستند، اما برای برابری ساده بسیار کندتر و پیچیده‌تر از == هستند. فقط زمانی استفاده کنید که نیاز به مطابقت با یک الگو یا schema دارید، نه برای مقایسه مستقیم رشته‌ها. در کدهای بزرگ یا حساس به عملکرد، ابتدا نرمال‌سازی کرده و از == استفاده کنید.

سوالات متداول

۱. آیا می‌توان از == برای رشته‌ها در پایتون استفاده کرد؟

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

مثال:

s1 = 'Hello'
s2 = 'Hello'
print(s1 == s2)  # Output: True

۲. چگونه بررسی کنیم که یک رشته برابر است؟

می‌توانید با استفاده از == بررسی کنید که یک رشته برابر باشد یا خیر. این عملگر مقادیر رشته‌ها را مقایسه می‌کند.

مثال:

s1 = 'Hello'
s2 = 'Hello'
print(s1 == s2)  # Output: True

۳. چگونه بررسی کنیم که یک متغیر برابر یک رشته است؟

می‌توانید با == بررسی کنید که مقدار یک متغیر برابر یک رشته باشد.

مثال:

var = 'Hello'
print(var == 'Hello')  # Output: True

۴. آیا از == برای رشته‌ها استفاده می‌کنیم؟

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

مثال:

s1 = 'Hello'
s2 = 'Hello'
print(s1 == s2)  # Output: True

۵. چگونه بررسی کنیم که دو رشته برابر هستند؟

با استفاده از == می‌توان بررسی کرد که دو رشته برابر باشند.

مثال:

s1 = 'Hello'
s2 = 'Hello'
print(s1 == s2)  # Output: True

۶. تفاوت == و is در پایتون چیست؟

  • == بررسی می‌کند که مقدار دو شیء برابر باشد.
  • is بررسی می‌کند که دو شیء دقیقاً یک شیء در حافظه باشند.
s1 = 'Hello'
s2 = 'Hello'
print(s1 == s2)  # Output: True
print(s1 is s2)  # Output: True, but this checks object identity, not equality

۷. چگونه مقایسه رشته بدون حساسیت به حروف انجام دهیم؟

می‌توانید هر دو رشته را به حروف کوچک یا بزرگ تبدیل کنید با استفاده از .lower() یا .upper() و سپس مقایسه کنید.

مثال:

s1 = 'Hello'
s2 = 'hello'
print(s1.lower() == s2.lower())  # Output: True

۸. چرا مقایسه رشته من کار نمی‌کند؟

دلایل ممکن شامل موارد زیر است:

  • حساسیت به حروف: 'Hello' با 'hello' برابر نیست.
  • فاصله‌های اضافی: رشته با فاصله شروع یا پایان با رشته بدون فاصله برابر نیست.
  • مقایسه با نوع غیررشته‌ای: مقایسه رشته با شیء غیررشته‌ای باعث TypeError می‌شود.

مثال:

s1 = 'Hello'
s2 = 'hello'
print(s1 == s2)  # Output: False, due to case sensitivity

۹. آیا می‌توانم رشته را با None مقایسه کنم؟

بله، می‌توان رشته را با None مقایسه کرد، اما بهتر است ابتدا بررسی کنید که شیء مورد نظر واقعاً رشته یا None باشد تا از TypeError جلوگیری شود.

مثال:

s1 = 'Hello'
s2 = None
if isinstance(s2, str):
    print(s1 == s2)
else:
    print("s2 is not a string.")

۱۰. چگونه رشته‌های چندخطی را مقایسه کنیم؟

می‌توانید رشته‌های چندخطی را با == مقایسه کنید. مطمئن شوید که فرمت رشته‌ها و کاراکترهای newline درست باشند.

مثال:

s1 = """Hello
World"""
s2 = """Hello
World"""
print(s1 == s2)  # Output: True

جمع بندی

در این راهنمای جامع از لیارا، به جزئیات مقایسه رشته‌ها در پایتون پرداختیم. ابتدا روش‌های پایه‌ای برابری رشته‌ها را بررسی کردیم، از جمله استفاده از عملگر == و تابع __eq__(). همچنین به اهمیت حساسیت به حروف در مقایسه‌ها اشاره کردیم و روش‌های مقایسه بدون حساسیت به حروف با استفاده از lower(), upper() و casefold() را نشان دادیم.

علاوه بر این، تفاوت‌های کلیدی بین عملگر == و is توضیح داده شد و تأکید شد که برای مقایسه رشته‌ها همیشه از == استفاده شود تا نتایج دقیق و قابل اعتماد حاصل گردد.

در نهایت، به خطاهای رایج در مقایسه رشته‌ها اشاره کردیم، مانند نادیده گرفتن حساسیت به حروف یا مقایسه رشته با اشیاء غیررشته‌ای، و نکات کاربردی برای رفع باگ‌ها و اشکال‌زدایی ارائه شد تا فرآیند مقایسه رشته‌ها در برنامه‌های واقعی ساده‌تر و ایمن‌تر باشد.

به اشتراک بگذارید

برچسب‌ها: