مقدمه

در درس قبل نوع str را معرفی کردیم و گفتیم که در پایتون، رشته‌های متنی به این نوع تعلق دارند. با توجه به اینکه یک مقدار متنی به صورت دنباله یا رشته‌ای از کاراکترهاست، از واژه‌ی String برای اشاره به مقادیر رشته‌ای استفاده می‌شود. در این درس، قصد داریم جزئیات بیشتری از کار با رشته‌های متنی بیان کنیم و به‌ویژه برخی از مهمترین کارهایی را که می‌توان روی رشته‌ها انجام داد، خواهیم دید. برای آزمایش کدهای این درس، یک فایل با نام python_strings.py ایجاد کنید.

تغییر در بزرگی و کوچکی حروف

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

Copy Icon python_strings.py
name = "harry potter"
print(name.title())

اگر این کدها را اجرا کنید، نتیجه‌ی زیر را مشاهده خواهید کرد.

Harry Potter

در مثال بالا از یک متد با نام title() استفاده شده است. یک متد (method) عمل یا اعمال مشخصی را روی بخشی از داده‌ها انجام می‌دهد. کاراکتر نقطه (dot) بعد از نام name برای مفسر به این معناست که متد title() باید روی متغیر name اعمال شود. هر متد با یک جفت پرانتز به پایان می‌رسد که می‌تواند اطلاعات اضافی را در قالب پارامترها برای متد فراهم کند. کار متد title() این است که حرف اول هر کلمه را به صورت بزرگ (Capital) نمایش می‌دهد. این متد به هیچ اطلاعات اضافی نیاز ندارد و بنابراین، پرانتزهای این متد خالی است.

متدهای دیگری هم داریم که به تغییر بزرگی و کوچکی حروف مربوط هستند. برای مثال، با استفاده از متدهای upper() و lower() می‌توانیم ترتیبی دهیم که همه‌ی حروف یک رشته به صورت بزرگ (uppercase) یا کوچک (lowercase) نمایش داده شوند.

Copy Icon python_strings.py
name = "Harry Potter"
print(name.upper())
print(name.lower())

خروجی این کدها به صورت زیر خواهد بود.

HARRY POTTER 
harry potter

استفاده از متغیرها در رشته‌ها

گاهی اوقات می‌خواهیم از مقدار یک متغیر در یک رشته استفاده کنیم. مثلاً فرض کنید دو متغیر داریم که یکی نام و دیگری فامیل را ذخیره کرده‌اند و می‌خواهیم با ترکیب آنها در یک رشته، نام کامل را نمایش دهیم.

Copy Icon python_strings.py
first_name = "harry"
last_name = "potter"
full_name = f"{first_name} {last_name}"
print(full_name)

همانطور که در مثال بالا می‌بینید، برای اینکه مقدار یک متغیر را در یک رشته قرار دهیم، باید حرف f را قبل از کوتیشن قرار دهیم و نام متغیر مورد نظر را درون یک جفت آکلاد وارد کنیم. با این کار، پایتون در زمان نمایش مقدار رشته، مقدار متغیر را به جای نام آن متغیر نمایش می‌دهد. این رشته‌ها را f-string می‌نامند که f نشانگر format است؛ چون پایتون رشته را با جایگزینی نام متغیر با مقدار آن، فرمت می‌کند. خروجی کد قبل به این صورت خواهد بود.

harry potter

کارهای زیادی را می‌توانیم با استفاده از f-strings انجام دهیم. مثال زیر را ببینید.

Copy Icon python_strings.py
first_name = "harry"
last_name = "potter"
full_name = f"{first_name} {last_name}"
print(f"Hello, {full_name.title()}!")

خروجی این کدها به صورت زیر است.

Hello Harry Potter!

یا به عنوان یک مثال دیگر، می‌توانیم از f-string برای تولید یک پیام استفاده کنیم و سپس، آن را به یک متغیر تخصیص دهیم.

Copy Icon python_strings.py
first_name = "harry"
last_name = "potter"
full_name = f"{first_name} {last_name}"
message = f"Hello, {full_name.title()}!"
print(message)

خروجی این کد هم شبیه کد قبلی است اما با تخصیص پیام به یک متغیر، ترتیبی داده‌ایم که متد print() پایانی خلاصه‌تر باشد.

کنترل کاراکترهای Whitespace در رشته‌ها

در برنامه‌نویسی، از واژه‌ی whitespace برای ارجاع به هر کاراکتر غیر چاپی (nonprinting) مانند space، tab و end-of-line استفاده می‌شود. از این کاراکترها می‌توانیم برای افزایش خوانایی کدهای خود استفاده کنیم.

برای اضافه کردن یک tab به متن خود، از \t استفاده می‌کنیم.

>>> print("Python") 
Python
>>> print("\tPython") 
    Python

برای اضفه کردن newline به متن از \n استفاده می‌کنیم.

>>> print("Languages:\nPython\nC\nJavaScript") 
Languages: 
Python 
C 
JavaScript

این کاراکترها را می‌توان به صورت ترکیبی هم استفاده کرد. برای مثال، \n\t از مفسر پایتون می‌خواهد که به خط بعدی منتقل شود و آن را با یک tab شروع کند. مثال زیر را ببینید.

>>> print("Languages:\n\tPython\n\tC\n\tJavaScript")
Languages: 
    Python 
    C 
    JavaScript

از کاراکترهای whitespace در آینده به‌دفعات استفاده می‌کنیم.

حذف کاراکترهای Whitespace اضافی

برای ما 'python' و 'python ' یکسان هستند اما از نظر مفسر پایتون اینها دو رشته‌ی متفاوت هستند. در واقع، مفسر پایتون متوجه کاراکتر space در انتهای رشته‌ی 'python ' می‌شود و آن را بخشی از رشته تلقی می‌کند، مگر اینکه ما چیز دیگری به مفسر اعلام کنیم.

توجه به این نوع کاراکترهای whitespace که می‌توانند در ابتدا و انتهای رشته‌ها باشند، موضوع مهی است؛ چون خیلی وقت‌ها می‌خواهیم دو رشته را با هم مقایسه کنیم و بر اساس نتیجه‌ی مقایسه، کارهای متفاوتی انجام دهیم. یک مثال مهم از این دست موارد، زمانی است که بخواهیم نام کاربری افراد را هنگام لاگین به یک وبسایت، بررسی کنیم. خوشبختانه، حذف این کاراکترهای اضافی از رشته‌ها در پایتون بسیار ساده است.

برای اطمینان از اینکه هیچ کاراکتر اضافی در سمت راست یک رشته وجود نداشته باشد، می‌توانیم از متد rstrip() استفاده کنیم.

1 >>> favorite_language = 'python '
>>> favorite_language 
2 'python ' 
3 >>> favorite_language.rstrip()                            
'python'
>>> favorite_language 
4 'python '

مقدار مربوط به متغیر favorite_language شامل یک کاراکتر space در سمت راست است (1). بنابراین، وقتی نام این متغیر را در ترمینال وارد می‌کنیم، مقدار 'python ' نمایش داده می‌شود (2). وقتی متد rstrip() روی متغیر favorite_language اعمال می‌شود (3)، این کاراکتر space حذف می‌شود؛ اما فقط به طور موقت. اگر بعد از اعمال این متد، مجدداً نام متغیر favorite_language را برای مشاهده‌ی مقدار آن وارد کنیم، مجدداً کاراکتر space در سمت راست رشته دیده می‌شود (4).

برای حذف دائم کاراکتر space از رشته، باید همانند زیر ترتیبی دهیم که متغیر favorite_language مقدار جدید را دریافت کند.

>>> favorite_language = 'python '
>>> favorite_language = favorite_language.rstrip() 
>>> favorite_language 
'python'

در اینجا تخصیص مجدد مقدار فاقد space به متغیر favorite_language باعث می‌شود این مقدار جدید در این متغیر ذخیره شده و جایگزین مقدار قبلی شود.

همانطور که احتمالاً می‌توانید حدس بزنید، حذف کاراکترهای whitespace از سمت چپ یک رشته با استفاده از متدی با نام lstrip() ممکن است و برای حذف کاراکترهای whitespace در هر دو سمت رشته از متد strip() استفاده می‌شود.

>>> favorite_language = ' python ' 
>>> favorite_language.rstrip() 
' python' 
>>> favorite_language.lstrip() 
'python ' 
>>> favorite_language.strip() 
'python'

حذف پیشوند از رشته‌ها

یک کار رایج دیگر در ارتباط با رشته‌ها، حذف پیشوندها (prefixes) است. برای نمونه، یک URL را در نظر بگیرید که معمولاً دارای پیشوند https:// است؛ ممکن است بخواهیم این پیشوند را از یک آدرس URL حذف کنیم. این کار را می‌توانیم به شکل زیر انجام دهیم.

>>> learnclasico_url = 'https://learnclasico.com' 
>>> learnclasico_url.removeprefix('https://') 
learnclasico.com

همانطور که می‌بینید، متد removeprefix() رشته‌ای را که به عنوان آرگومان دریافت می‌کند، به عنوان پیشوند در نظر گرفته و آن را از ابتدای رشته‌ای که این متد روی آن فراخوانی شده حذف می‌کند.

همانند آنچه در مورد متدهای مربوط به حذف whitespace دیدیم، متد removeprefix() هم رشته‌ی اصلی را تغییر نمی‌دهد و اگر بخواهیم مقدار جدید را (که فاقد پیشوند است) حفظ کنیم، یا باید آن را به متغیر اصلی تخصیص مجدد بدهیم یا اینکه آن را به یک متغیر جدید تخصیص دهیم.

>>> simple_url = learnclasico_url.removeprefix('https://')

کار با زیررشته‌ها

نوع str متدهایی را برای کار روی زیررشته‌ها ارائه می‌دهد. در اینجا چند مورد از مهمترین و پرکاربردترین این متدها را معرفی می‌کینم که برای اعمالی مانند جستجوی یک عبارت در رشته و جایگزینی بخشی از یک رشته کاربرد دارند.

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

برای پیدا کردن یک زیررشته در رشته‌ها می توانیم از یکی از متدهای find() و index() استفاده کنیم. هر دوی این متدها اندیسی را که زیررشته‌ی مورد نظر شروع می‌شود، برمی‌گردانند. اما تفاوت این دو متد در رفتارشان هنگام موجود نبودن عبارت مورد نظر در رشته است. متد find() در صورت نبودن متن مورد جستجو در رشته، مقدار -1 را برمی‌گرداند اما متد index() خطا تولید می‌کند.

>>> message = "Hello World!"
>>> message.find("World")
6
>>> message.find("world")
-1
>>> message.index("World")
6
>>> message.index("world")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: substring not found
          

همانطور که در مثال بالا می‌بینید، این متدها نسبت به بزرگی و کوچکی حروف حساس هستند.

جایگزینی متن رشته‌ها

با استفاده از یکی دیگر از متدهای نوع str به نام replace() می‌توانیم بخشی از رشته را با یک مقدار دیگر جایگزین کنیم. البته فراموش نکنید که رشته‌ها تغییرناپذیرند و برای اِعمال تغییر، باید مقدار جدید را به یک متغیر اختصاص داد.

>>> message = "Hello World"
>>> message = message.replace("World", "Python")
>>> message
'Hello Python'