لیست مطالب

رشته‌ها (Strings) در پایتون + نکات پیشرفته

رشته ها در پایتون

رشته‌ها یا بصورت خلاصه str در پایتون یکی از data typeهای پایه‌ای هستند که برای نمایش متن به کار می‌روند. یک رشته توالی‌ای از کاراکترهاست که درون کوتیشن (تک ‘ یا دوبل “”) قرار می‌گیرد. در این درس با نحوه‌ی کار با رشته‌ یا استرینگ در پایتون بصورت کامل آشنا می‌شویم. مباحثی که پوشش خواهیم داد عبارتند از برش رشته‌ها، ویرایش و تغییر رشته‌ها, اتصال رشته‌ها به یکدیگر، فرمت‌دهی به رشته‌ها، استفاده از کاراکترهای ویژه، و متدهای رایج رشته‌ای. هر بخش با مثال‌های عملی همراه است تا هم مبتدیان و هم برنامه‌نویسان حرفه‌ای بتوانند نکات مفیدی بیاموزند.

برش رشته‌ها (Slicing Strings)

یکی از امکانات قدرتمند رشته‌ها در پایتون برش (slicing) است که به شما اجازه می‌دهد یک زیررشته (substring) از رشته‌ی اصلی استخراج کنید. برای برش یک رشته از سینتکس string[start: end] استفاده می‌شود؛ به این صورت که ایندکس شروع start و ایندکس پایان end را با علامت دونقطه از هم جدا می‌کنیم. ایندکس‌ها از صفر شماره‌گذاری می‌شوند (یعنی اولین کاراکتر رشته ایندکس 0 دارد) و زیررشته شامل کاراکترهای بین ایندکس شروع تا یک کاراکتر قبل از ایندکس پایان خواهد بود

به عبارت دیگر، کاراکتری که در موقعیت end قرار دارد در زیررشته لحاظ نمی‌شود.

ایندکس در پایتوننمایش مفهوم ایندکس‌گذاری یک رشته (مثال: رشته “meedlearn.com” که ایندکس‌های 0 تا 12 از ابتدا و -13 تا -1 از انتها را نشان می‌دهد) اگر ایندکس شروع را ننویسیم، برش از ابتدای رشته آغاز می‌شود و اگر ایندکس پایان خالی بماند، برش تا انتهای رشته ادامه پیدا می‌کند. به عنوان مثال:

				
					text = "Hello, World!"
print(text[:5])   # خروجی: Hello
print(text[7:])   # خروجی: World!

				
			

در مثال بالا text[:5] کاراکترهای ابتدا تا قبل از ایندکس 5 (یعنی “Hello”) و text[7:] کاراکترهای از ایندکس 7 تا انتها (یعنی “!World”) را چاپ می کند. همچنین می‌توانید از ایندکس‌های منفی برای برش از انتهای رشته استفاده کنید. برای نمونه، عبارت text[-6:-1] زیررشته‌ای از شش کاراکتر انتهایی رشته (به جز آخرین کاراکتر) را برمی‌گرداند:

				
					print(text[-6:-1])  # خروجی: World

				
			

در اینجا از ایندکس منفی 6- (ششمین کاراکتر از انتها) تا ایندکس 1- (آخرین کاراکتر، که خودش شامل نمی‌شود) برش انجام شده است و کلمه‌ی “World” حاصل شده است. علاوه بر این می‌توان گام (step) برش را نیز مشخص کرد. سینتکس کامل برش به صورت string[start: end: step] است
به طور پیش‌فرض step برابر 1 است که به معنی انتخاب پیوسته‌ی کاراکترهاست. اگر step را 2 قرار دهیم، کاراکترها را دو تا یکی برمی‌دارد. مثلا:

				
					text = "abcdefg"
print(text[0:7:2])  # خروجی: aceg

				
			

در این مثال از ایندکس 0 تا 6 با گام 2 برش زدیم و هر دو کاراکتر یکی را انتخاب کردیم. جالب‌تر اینکه اگر مقدار step منفی باشد می‌توان برش را در جهت معکوس انجام داد. برای مثال text[::-1] رشته را معکوس می‌کند:

				
					print(text[::-1])  # خروجی: gfedcba

				
			

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

ویرایش رشته‌ها (Modify Strings)

در پایتون رشته‌ها غیرقابل تغییر (immutable) هستند، به این معنی که پس از ایجاد یک رشته،9 نمی‌توان مستقیماً کاراکتری از آن را تغییر داد یا به عبارتی نمی‌توان به یک ایندکس از رشته مقداری جدید نسبت داد. با این حال، پایتون مجموعه‌ای از متدهای داخلی رشته فراهم کرده است که با استفاده از آن‌ها می‌توان رشته‌های جدیدی بر پایه‌ی رشته‌ی اصلی ساخت. توجه کنید که تمامی این متدها مقدار جدیدی برمی‌گردانند و رشته‌ی اصلی را دستکاری نمی‌کنند. چند مورد از متدهای پرکاربرد برای ویرایش محتوای رشته عبارت‌اند از:

تبدیل به حروف بزرگ/کوچک: متد ()upper تمام حروف رشته را به حروف بزرگ (upper-case) تبدیل می‌کند و متد ()lower تمام حروف را به حروف کوچک (lower-case) تبدیل می کند.

حذف فاصله‌های اضافی: متد ()strip  فاصله های خالی (space های )ابتدا و انتهای رشته را حذف می‌کند که معمولاً برای پاک کردن  spaceهای اضافی ورودی‌های متنی کاربرد دارد.

جایگزینی زیررشته: متد replace(old, new) تمام بخش‌های متن مطابق old را در رشته با متن new جایگزین می‌کند.

تقسیم کردن رشته: متد split(separator) رشته را بر اساس یک جداکننده‌ی مشخص جدا جدا کرده و در خروجی یک  لیست از بخش‌ها را برمی‌گرداند (مثلاً با جداکننده‌ی ویرگول یا فاصله، کلمات جمله را جدا می‌کند).

به عنوان نمونه، کد زیر چند عملیات متداول روی رشته را نمایش می‌دهد:

				
					text = " Hello, World! "
print(text.upper())       # خروجی: " HELLO, WORLD! "
print(text.strip())       # خروجی: "Hello, World!"
print(text.replace("Hello", "Hi"))  # خروجی: " Hi, World!"
print(text.split(","))    # خروجی: [' Hello', ' World! ']

				
			

در ابتدا رشته‌ی نمونه شامل حروف بزرگ و کوچک و فاصله در ابتدا و انتهاست. نتیجه‌ی ()upper تبدیل کل عبارت به حروف بزرگ، و نتیجه‌ی ()strip حذف فاصله‌های ابتدا و انتها است. سپس با replace(“Hello”, “Hi”) کلمه‌ی “Hello” با “Hi” جایگزین شده و با (“,”)split رشته به دو بخش قبل و بعد از ویرگول(“,”)تبدیل شده است (در قالب لیست نمایش داده می‌شود).

 

اتصال رشته‌ها (String Concatenation)

اتصال رشته‌ها یا چسباندن رشته‌ها به هم یکی از عملیات پایه‌ای روی متن است. برای اتصال دو رشته به یکدیگر کافیست از عملگر + استفاده کنید. به عنوان مثال:

				
					a = "Hello"
b = "World"
c = a + b
print(c)  # خروجی: HelloWorld

				
			

در مثال بالا، رشته‌های a و b مستقیماً به هم متصل شده‌اند. برای افزودن فاصله یا هر کاراکتر دیگر بین دو رشته، می‌توان آن کاراکتر را به صورت یک رشته‌ی جداگانه در میان آن‌ها قرار داد:

				
					c = a + " " + b
print(c)  # خروجی: Hello World

				
			

در اینجا یک فضای خالی (” “) بین دو رشته قرار داده‌ایم تا در نتیجه‌ی نهایی فاصله رعایت شود. علاوه بر عملگر +، در پایتون می‌توان از عملگر * نیز برای تکرار یک رشته استفاده کرد؛ مثلاً “Hi” * 3 نتیجه “HiHiHi” خواهد داشت. همچنین برای اتصال تعداد زیادی رشته (مثلاً اتصال المان‌های یک لیست)، استفاده از متد join به جای + پیشنهاد می‌شود که در بخش متدهای رشته به آن اشاره خواهیم کرد.

 

F String در پایتون (فرمت دهی به رشته ها)

در برنامه‌نویسی، اغلب نیاز است مقادیر متغیرها را درون یک رشته قرار دهیم یا قالب‌بندی خاصی را روی اعداد و متن اعمال کنیم. پایتون برای این کار چند روش دارد که جدیدترین و رایج‌ترین آن استفاده از f strings در پایتون است. از نسخه‌ی 3.6 به بعد، با قرار دادن حرف f قبل از آغاز کوتیشن رشته، می‌توان مستقیماً expressionها (مثل متغیر یا حاصل یک تابع/عملیات) را داخل آکولاد {} درون متن قرار داد. به عنوان مثال:

				
					name = "Alice"
age = 30
print(f"My name is {name} and I am {age} years old.")
# خروجی: My name is Alice and I am 30 years old.

				
			

در رشته‌ی بالا، مقادیر متغیرهای name و age در مکان‌های مشخص شده قرار گرفته‌اند. مزیت f string این است که می‌توانید مستقیماً هر عبارت پایتونی را داخل آکولاد قرار دهید؛ برای مثال انجام محاسبات یا استفاده از شرط‌ها:

				
					score = 85
print(f"You have {'passed' if score >= 60 else 'failed'} the exam.")
# خروجی: You have passed the exam.

				
			

در این مثال، عبارت شرطی داخل آکولاد اجرا شده و نتیجه‌ی آن (“passed” یا “failed”) در رشته‌ی نهایی قرار می‌گیرد. روش قدیمی‌تر برای قالب‌بندی رشته‌ها استفاده از متد ()format است. در این روش به جای قرار دادن مستقیم متغیرها در متن، از   {} در رشته استفاده می‌شود و سپس مقادیر به متد format پاس داده می‌شوند تا به ترتیب در محل {}ها قرار گیرند. برای مثال:

				
					template = "My name is {} and I am {} years old."
print(template.format(name, age))
# خروجی: My name is Alice and I am 30 years old.

				
			

در صورت نیاز می‌توانید داخل {}  مشخص کنید که هر مقدار در کدام موقعیت قرار گیرد (با استفاده از اندیس عددی داخل آکولاد) یا حتی از نام‌های کلیدی استفاده کنید، اما در اغلب موارد رعایت ترتیب قرارگیری کافی است. با اینکه متد format نسبت به رشته‌های f انعطاف‌پذیری کمتری دارد، دانستن آن برای حفظ سازگاری با نسخه‌های قدیمی‌تر پایتون یا کدهای legacy مفید است. همچنین عملگر درصد (%) نیز در پایتون برای قالب‌بندی رشته (مشابه زبان C) وجود دارد که امروزه کمتر استفاده می‌شود.

کاراکترهای ویژه در رشته‌ها (Escape Characters)

گاهی لازم است در رشته از کاراکترهایی استفاده کنیم که به طور عادی ممکن است باعث بروز خطا شوند یا مفهوم خاصی داشته باشند. برای مثال، در نظر بگیرید می‌خواهیم در یک رشته ، علامت کوتیشن دوتایی قرار دهیم. در چنین حالتی پایتون انتهای رشته را اشتباهاً زودتر تشخیص می‌دهد و کد دچار خطا می‌شود. به این کاراکترهای خاص یا غیرمجاز در متن، کاراکتر ویژه می‌گوییم. راه‌حل پایتون برای درج این کاراکترهای ویژه، استفاده از کاراکتر گریز (escape character) است. کاراکتر گریز یک بک‌اسلش \ است که قبل از کاراکتر خاص موردنظر قرار می‌گیرد و به پایتون اعلام می‌کند که کاراکتر بعدی را به شکل ویژه‌ای تفسیر کند. برای مثال، عبارت زیر بدون استفاده از بک‌اسلش نامعتبر است:

				
					print("We are the "Vikings" from the north.")  – این دستور خطا می‌دهد

				
			

اما با قرار دادن یک بک‌اسلش قبل از نقل‌قول‌های داخلی، پایتون متوجه می‌شود که منظور ما درج خود علامت " در متن است نه پایان رشته:

				
					print("We are the \"Vikings\" from the north.")
# خروجی: We are the "Vikings" from the north.

				
			

در رشته‌ی بالا، از \ برای نمایش خود کوتیشن داخل متن استفاده کرده‌ایم. به طور مشابه برای نمایش خود بک‌اسلش، آن را دوبار می‌نویسیم (\\)، یا برای ایجاد خط جدید از n\ استفاده می‌کنیم. برخی از کاراکترهای ویژه‌ی پرکاربرد در پایتون عبارت‌اند از: ‘\ (نمایش خود علامت نقل‌قول تکی)، “\ (نمایش علامت نقل‌قول دوتایی)، \\ (نمایش بک‌اسلش)، n\ (پرش به خط بعدی)، t\ (تب یا فاصله‌ی افقی)، b\ (بک‌اسپیس) و … . اگر به هر دلیل بخواهید جلوی تفسیر خاص کاراکترهای ویژه را بگیرید (مثلاً در مسیرهای ویندوز یا عبارت‌های منظم – regex – که در آن‌ها بک‌اسلش زیاد استفاده می‌شود)، می‌توانید از رشته خام (raw string) استفاده کنید

رشته‌ی خام با پیشوند r قبل از کوتیشن مشخص می‌شود و تمام بک‌اسلش‌ها را دقیقاً به همان شکل در نظر می‌گیرد. به طور مثال:

				
					path = r"C:\Users\nima\Docs\newfile.txt"
print(path)
# خروجی: C:\Users\nima\Docs\newfile.txt

				
			
در رشته‌ی بالا، بر خلاف حالت عادی، n\ به عنوان خط جدید تفسیر نشده و دقیقاً کاراکترهای \ و n در خروجی ظاهر شده‌اند. < id ="functional-string-methods" h2>متدهای رشته‌ای پرکاربرد (String Methods) رشته‌های پایتون دارای متدهای داخلی بسیاری هستند که عملیات مختلفی را روی متن انجام می‌دهند (بدون اینکه رشته‌ی اصلی را تغییر دهند). برخی از این متدها را در بخش‌های قبل دیدیم. در این قسمت به چند متد پراستفاده‌ی دیگر اشاره می‌کنیم: find(sub):  ایندکس اولین زیر رشته (substring) را در رشته‌ی اصلی برمی‌گرداند. اگر کلا زیر رشتهی موردنظر پیدا نشود، -1 برمی‌گرداند. startswith(prefix): بررسی می‌کند آیا رشته‌ی اصلی با prefix شروع می‌شود یا خیر (خروجی True/False). متد مکمل آن endswith(suffix) است که انتهای رشته را چک می‌کند. count(sub): تعداد دفعاتی که زیررشته‌ی sub در متن ظاهر شده را برمی‌گرداند. join(iterable): رشته‌ای که متد join روی آن صدا زده شده را بین عناصر iterable داده‌شده (مثل لیست) قرار می‌دهد و حاصل را به عنوان یک رشته‌ی جدید برمی‌گرداند. این متد برای اتصال لیستی از کلمات با یک جداکننده بسیار کاربردی است. مثال:
				
					text = "Hello World"
print(text.find("World"))   # خروجی: 6
print(text.find("Python"))  # خروجی: -1  (زیر رشته یافت نشد)
words = ["Python", "is", "fun"]
print(" ".join(words))      # خروجی: Python is fun

				
			

در قطعه کد بالا، find مکان کلمه‌ی “World” را که از ایندکس 6 شروع می‌شود یافته است، و برای کلمه‌ی ناموجود نتیجه -1 داده است. سپس join لیست کلمات را با فاصله‌ی ” ” به یکدیگر متصل کرده و یک جمله ساخته است. متدهای کاربردی دیگری نیز وجود دارند؛ برای نمونه replace و split پیش‌تر توضیح داده شدند. تابع داخلی len() نیز که روی هر رشته قابل استفاده است، طول رشته (تعداد کاراکترها) را برمی‌گرداند. برای آشنایی بیشتر با متدهای رشته‌ای می‌توانید به مستندات پایتون یا مراجع موجود مراجعه کنید. جدول زیر (برگرفته از W3Schools) برخی از متدهای رایج را خلاصه کرده است:

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

منابع استفاده شده:
w3schools

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

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *