در زبان برنامهنویسی پایتون، شش نوع داده گوناگون وجود دارد: عدد (Number)، لیست در پایتون (List)، تاپل در پایتون (Tuple)، مجموعه (Set) در پایتون، دیکشنری در پایتون (Dictionary) و رشته (String). نوع داده رشته برای ذخیرهسازی دادههای متنی و کار با آنها به کار میرود.

در مسیر آموزش پایتون، تسلط بر ساختار رشته پایتون و روشهای مدیریت دادههای متنی بخش مهمی از کدنویسی را تشکیل میدهد. در این مطلب، روش ساخت استرینگ در پایتون، دسترسی به کاراکترها با اندیسدهی و برشزنی، ویژگی تغییرناپذیری، محاسبه طول رشته در پایتون، قالببندی متن و مدیریت خطاهای رایج را همراه با کد و خروجی بررسی میکنیم.

رشته یا استرینگ در پایتون چیست؟
رشته در پایتون توالی یا دنبالهای از کاراکترها است که درون علامتهای نقل قول (کوتیشن) قرار میگیرد. هر کاراکتر یک نماد است؛ برای نمونه، زبان انگلیسی ۲۶ کاراکتر دارد. رشته ‘Opus’ از کاراکترهای ‘O’، ‘p’، ‘u’ و ‘s’ تشکیل میشود. هر یک از این کاراکترهای تکحرفی نیز خود یک رشته است.
کامپیوترها با اعداد دودویی، یعنی صفر و یک، کار میکنند و مستقیماً با کاراکترها کار نمیکنند. کاراکترهایی که روی صفحه نمایش دیده میشوند، در حافظه کامپیوتر به صورت ترکیبی از صفرها و یکها ذخیره میشوند. فرآیند تبدیل کاراکتر به عدد را «رمزنگاری» (Encoding) و فرآیند معکوس آن را «رمزگشایی» (Decoding) مینامند. «اَسکی» (ASCII) و «یونیکُد» (Unicode) از روشهای شناختهشده رمزنگاری هستند. در پایتون، رشته دنبالهای از کاراکترهای یونیکد است. این استاندارد کاراکترهای تمام زبانها را پوشش میدهد و کدگذاری آنها را یکنواخت میکند.
پایتون برای نوع داده رشته یک کلاس داخلی به نام str دارد. کلاس قدیمی string نیز برای رشته وجود دارد، اما منسوخ شده است و نباید از آن استفاده کنید. همچنین در زبان برنامهنویسی پایتون روشهای گوناگونی برای تبدیل رشته به عدد و تبدیل رشته به لیست وجود دارد. حتی میتوان کدهای نوشتهشده به شکل رشته را با تابع eval در پایتون اجرا کرد.
روش ساخت رشته در پایتون
برای تعریف Str در پایتون، کاراکترهای مورد نظر را درون علامتهای نقل قول قرار دهید و رشته را به یک متغیر تخصیص دهید.
ساخت رشتههای تکخطی و چندخطی
رشتههای تکخطی با قرار دادن کاراکترها میان یک جفت نقل قول تکی (”) یا یک جفت نقل قول دوتایی (“”) ساخته میشوند؛ هرچند استفاده از تککوتیشن مرسومتر است. برای مثال، ‘Opus’ و “Opus” هر دو یک رشته یکسان هستند.
اگر به رشتهای نیاز دارید که در چند خط ادامه پیدا کند، باید از سه علامت نقل قول تکی (”’ ”’) یا سه علامت نقل قول جفتی (“”” “””) استفاده کنید. این روش برای نوشتن رشتههای چندخطی و «داکاسترینگ» (Docstring) به کار میرود.
# ساخت رشته با تک کوتیشن، دابل کوتیشن و سه کوتیشن
my_string = 'Hello'
print(my_string)
my_string = "Hello"
print(my_string)
my_string = '''Hello'''
print(my_string)
# ساخت رشته چندخطی با سه علامت نقل قول
message = """To avoid pain, they avoid pleasure.
To avoid death, they avoid life."""
print(message)
خروجی اجرای این کد:
Hello
Hello
Hello
To avoid pain, they avoid pleasure.
To avoid death, they avoid life.

تشخیص نوع داده رشته با تابع type()
مفسر پایتون هر مقداری را که داخل کوتیشن یا دابلکوتیشن قرار بگیرد، یک رشته (String) میشناسد. حتی اگر عددی مانند ‘۱۲۳۴’ را داخل کوتیشن قرار دهید، نوع داده آن متغیر رشته خواهد بود. برای مشاهده و بررسی نوع یک متغیر، میتوانید از تابع type() استفاده کنید:
a = 'mongard'
b = "amir"
c = '1234'
print(type(a))
print(type(b))
print(type(c))
در خروجی، نوع هر سه متغیر کلاس str است:
<class 'str'>
<class 'str'>
<class 'str'>
دسترسی به کاراکترها و تکه کردن رشته در پایتون
رشته در پایتون، مانند لیست یا تاپل، یک دنباله (Sequence) است. کاراکترهای آن ترتیب مشخصی دارند و به هر کاراکتر یک عدد صحیح به نام «اندیس» (Index) اختصاص داده میشود. برای دسترسی به یک کاراکتر از روش Indexing و برای دسترسی به چند کاراکتر، یعنی بخشی از رشته، از روش Slicing استفاده میشود.

دسترسی به یک کاراکتر با روش Indexing (اندیسدهی مثبت و منفی)
برای دریافت یک کاراکتر مشخص، باید اندیس آن را داخل علامت براکت [] پس از نام متغیر قرار دهید. در پایتون، شمارش اندیسها از ۰ شروع میشود؛ بنابراین اندیس اولین کاراکتر ۰ و دومین کاراکتر ۱ است و شمارش به همین ترتیب ادامه مییابد:
model = 'ChatGPT'
# دسترسی به اولین کاراکتر
print(model[0])
# دسترسی به پنجمین کاراکتر
print(model[4])
خروجی:
C
G
پایتون برای دنبالهها از اندیسدهی منفی نیز پشتیبانی میکند. در این روش، شمارش از انتهای رشته آغاز میشود؛ اندیس آخرین کاراکتر -۱ و اندیس کاراکتر یکی مانده به آخر -۲ است:
model = 'ChatGPT'
# دسترسی به آخرین کاراکتر
print(model[-1])
# دسترسی به چهارمین کاراکتر از آخر
print(model[-4])
خروجی:
T
t

دسترسی به بخشی از رشته با روش Slicing (برشزنی)
برای جدا کردن و دسترسی به بازه مشخصی از کاراکترهای رشته، از عملگر برشزنی، یعنی علامت دونقطه (:) داخل براکت، استفاده میشود. در این روش، اندیس شروع و پایان را به صورت [شروع:پایان] مینویسید.
در روش Slicing، کاراکتر اندیس شروع در خروجی قرار میگیرد، اما کاراکتر اندیس پایان در بازه نیست. برای نمونه، [۰:۴] کاراکترهای اندیس ۰ تا اندیس ۳ را برمیگرداند. کد زیر چهار حالت مختلف برشزنی رشته را نشان میدهد:
a = 'mongard'
# ۱. مشخص کردن اندیس شروع و پایان (از اندیس 0 تا 3)
print(a[0:4])
# ۲. نوشتن اندیس پایان بدون عدد شروع (از ابتدای رشته تا اندیس 3)
print(a[:4])
# ۳. نوشتن اندیس شروع بدون عدد پایان (از اندیس 3 تا انتهای رشته)
print(a[3:])
# ۴. ننوشتن هر دو عدد (از ابتدا تا انتهای رشته)
print(a[:])
خروجی این چهار حالت:
mong
mong
gard
mongard
در برشزنی میتوانید اندیسهای مثبت و منفی را نیز با هم ترکیب کنید. در مثال زیر روی رشته ‘programiz’، برش [۵:-۲] کاراکترهای ششم (اندیس ۵) تا پیش از کاراکتر یکی مانده به آخر (اندیس -۲)، یعنی تا کاراکتر هفتم، را جدا میکند و کد آنها را چاپ میکند:
my_str = 'programiz'
# برش از اندیس 1 تا 4
print('my_str[1:5] =', my_str[1:5])
# ترکیب اندیس مثبت و منفی
print('my_str[5:-2] =', my_str[5:-2])
خروجی:
my_str[1:5] = rogr
my_str[5:-2] = am
خطاهای رایج هنگام اندیسدهی (IndexError و TypeError)
هنگام دسترسی به کاراکترهای رشته، دو خطای رایج رخ میدهد:
۱. خطای IndexError: اگر بخواهید به کاراکتری خارج از محدوده اندیسهای رشته دسترسی پیدا کنید، پایتون خطای خارج از محدوده بودن اندیس را صادر میکند:
>>> my_string = 'programiz'
>>> my_string[15]
IndexError: string index out of range
۲. خطای TypeError: اندیس رشته باید یک عدد صحیح (Integer) باشد. اگر داخل براکت از اعداد اعشاری (ممیز شناور) یا سایر انواع داده استفاده کنید، با خطای نوع داده مواجه میشوید:
>>> my_string = 'programiz'
>>> my_string[1.5]
TypeError: string indices must be integers

روش تغییر یا حذف یک رشته در پایتون (ویژگی تغییرناپذیری)
نوع داده رشته در پایتون تغییرناپذیر (Immutable) است. پس از ساختن رشته و تخصیص آن، نمیتوانید کاراکترهای درون آن را تغییر دهید یا ویرایش کنید. اگر بخواهید یکی از کاراکترهای رشته را با اندیسدهی تغییر دهید، مفسر پایتون خطای TypeError میدهد:
>>> my_string = 'programiz'
>>> my_string[5] = 'a'
TypeError: 'str' object does not support item assignment
برای تغییر محتوای متنی دو راه دارید: یک رشته جدید را به همان متغیر قبلی تخصیص دهید، یا نسخه تغییریافتهای از رشته اصلی را در قالب رشتهای جدید بسازید:
# روش اول: تخصیص یک رشته جدید به همان متغیر
my_string = 'programiz'
my_string = 'Python'
print(my_string) # خروجی: Python
# روش دوم: ترکیب رشتهها و ساخت یک رشته جدید
model = 'Opus'
version = '5'
model = model + " " + version
print(model) # خروجی: Opus 5
به دلیل ویژگی تغییرناپذیری، امکان حذف یک کاراکتر خاص از درون رشته وجود ندارد. استفاده از کلیدواژه del روی اندیس رشته نیز خطای TypeError میدهد:
>>> my_string = 'Python'
>>> del my_string[1]
TypeError: 'str' object doesn't support item deletion
اما میتوانید متغیر رشته را با کلیدواژه del یکجا حذف کنید. پس از حذف متغیر، فراخوانی دوباره آن باعث بروز خطای NameError، به معنای تعریف نشدن نام متغیر، خواهد شد:
>>> my_string = 'Python'
>>> del my_string
>>> my_string
NameError: name 'my_string' is not defined
عملیاتهای کاربردی روی رشتهها در پایتون
روی رشتهها در پایتون میتوان عملیاتهای مختلفی انجام داد؛ از جمله اتصال، تکرار، پیمایش کاراکترها و بررسی وجود یک زیررشته در رشته.
الحاق (+) و تکرار (*) رشتهها
اتصال دو یا چند رشته به یکدیگر و تبدیل آنها به یک رشته واحد را «الحاق» (Concatenation) میگویند. عملگر + کار الحاق رشتهها را انجام میدهد و عملگر * یک رشته را به تعداد دفعات مشخصشده تکرار میکند:
str1 = 'Hello'
str2 = 'World!'
# الحاق دو رشته بدون فاصله
print('str1 + str2 =', str1 + str2)
# الحاق دو رشته همراه با ایجاد فاصله
print('str1 + str2 =', str1 + ' ' + str2)
# تکرار رشته به تعداد ۳ بار
print('str1 * 3 =', str1 * 3)
خروجی:
str1 + str2 = HelloWorld!
str1 + str2 = Hello World!
str1 * 3 = HelloHelloHello
برای اتصال دو رشته بدون عملگر +، میتوانید آنها را کنار هم بنویسید. همچنین برای الحاق رشتههایی که در خطهای متفاوت قرار دارند، میتوانید آنها را داخل پرانتز () بگذارید:
>>> # نوشتن دو رشته در کنار هم
>>> 'Hello ''World!'
'Hello World!'
>>> # استفاده از پرانتز برای رشتههای موجود در چند خط
>>> s = ('Hello '
... 'World')
>>> s
'Hello World'
حلقه زدن و پیمایش کاراکترها با for
رشته دنبالهای از کاراکترها است؛ به همین دلیل، میتوان با حلقه for در پایتون تکتک کاراکترهای آن را پیمایش کرد:
model = 'Opus'
for c in model:
print(c)
خروجی:
O
p
u
s
در مثال زیر، با ترکیب حلقه for و دستور شرطی if، تعداد تکرار حرف ‘l’ در رشته ‘Hello World’ شمارش و در خروجی چاپ میشود:
count = 0
for letter in 'Hello World':
if(letter == 'l'):
count += 1
print(count, 'letters found')
خروجی:
3 letters found
تست عضویت زیررشته با کلیدواژه in
برای بررسی وجود یک زیررشته، مانند حرف یا کلمه، در رشتهای دیگر از کلیدواژههای in و not in استفاده میشود. خروجی این بررسی مقدار منطقی True یا False است. میتوان از این مقدار در دستور شرطی if نیز استفاده کرد:
print('Chat' in 'ChatGPT') # خروجی: True
print('Claude' not in 'ChatGPT') # خروجی: True
print('a' in 'program') # خروجی: True
print('at' not in 'battle') # خروجی: False
محاسبه طول رشته در پایتون و توابع توکار
پایتون توابع توکار (Built-in Functions) متعددی برای کار با رشتهها دارد که امکانات گوناگونی فراهم میکنند. len() و enumerate() دو مورد از متداولترین آنها هستند.
به دست آوردن طول رشته با تابع len()
تابع توکار len() تعداد کاراکترهای یک رشته را میشمارد و طول رشته در پایتون را به صورت یک عدد صحیح برمیگرداند:
model = 'Opus'
# شمارش تعداد کاراکترهای رشته
print(len(model))
خروجی:
4

شمارش کاراکترها و اندیس با تابع enumerate()
تابع توکار enumerate() یک شیء شمارشی (Enumerate Object) برمیگرداند. این تابع اندیس و مقدار تمام عناصر رشته را به صورت جفتهای (اندیس، مقدار) تولید میکند:
my_str = 'Opus'
list_enumerate = list(enumerate(my_str))
print(list_enumerate)
خروجی:
[(0, 'O'), (1, 'p'), (2, 'u'), (3, 's')]
متدها و روشهای قالببندی (Formatting) رشته پایتون
کلاس str در پایتون متدها و ابزارهای داخلی گوناگونی را برای دستکاری متن و ترکیب متغیرها با رشتهها در اختیار برنامهنویس قرار میدهد.
جایگزینی کاراکترها با متد replace()
متد replace() برای جایگزین کردن بخشی از متن، یعنی یک زیررشته، با متنی دیگر به کار میرود. چون رشتهها تغییرناپذیر هستند، این متد یک رشته جدید با مقادیر جایگزینشده برمیگرداند و رشته اصلی را تغییر نمیدهد:
text = "ChatGPT is great."
# جایگزینی "ChatGPT" با "Claude"
new_text = text.replace("ChatGPT", "Claude")
print(new_text)
خروجی:
Claude is great.

قالببندی رشته با f-string و متد format()
در پایتون، دو روش رایج برای ساختن رشتههای پویا و ترکیب مقادیر و متغیرها در متن وجود دارد:
۱. استفاده از f-string: یک f-string با قرار دادن حرف f پیش از علامت کوتیشن رشته آغاز میشود. علامتهای آکولاد {} در متن رشته، نگهدارنده جا (Placeholder) هستند. میتوانید نام متغیرها یا عبارتها را مستقیماً درون این علامتها قرار دهید:
company = 'Google'
field = 'AI'
message = f'{company} is an {field} company.'
print(message)
خروجی:
Google is an AI company.
۲. استفاده از متد format(): متد format() روی شیء رشته فراخوانی میشود. در این روش نیز علامت آکولاد {} در متن، فیلد جایگزین است. برای تعیین ترتیب قرارگیری مقادیر در آکولادها، میتوان از آرگومانهای موقعیتی (بر اساس ترتیب یا شماره اندیس) یا آرگومانهای کلیدواژهای (بر اساس نام) استفاده کرد. متد format() همچنین میتواند مشخصههای قالب گزینشی داشته باشد که با علامت دونقطه (:) از نام فیلد در داخل آکولاد جدا میشوند:
# ترتیب پیشفرض
print("{} and {}".format("Python", "Programming"))
# استفاده از آرگومان موقعیتی
print("{1} and {0}".format("Python", "Programming"))
# استفاده از آرگومان کلیدواژهای
print("{name} is an {field} company.".format(name="Google", field="AI"))
خروجی:
Python and Programming
Programming and Python
Google is an AI company.
توالیهای فرار (Escape Sequences) و رشته خام در پایتون
توالیهای فرار برای قرار دادن کاراکترهای خاص، مانند علامتهای نقل قول، خط جدید یا تب، در داخل رشته به کار میروند.
حل مشکل کوتیشنها و جدول کاراکترهای فرار
فرض کنید میخواهید جملهای مانند He said, “What’s there?” را در یک رشته ذخیره و چاپ کنید. این جمله هم تککوتیشن (‘) دارد و هم دابلکوتیشن (“). اگر عبارت را مستقیماً داخل تککوتیشن یا دابلکوتیشن قرار دهید، مفسر پایتون فقط بخش ابتدایی، مانند “He said, “، را رشته تشخیص میدهد. سپس در تفسیر ادامه متن دچار مشکل میشود و خطای نحوی (SyntaxError) میدهد:
>>> print("He said, "What's there?"")
SyntaxError: invalid syntax
>>> print('He said, "What's there?"')
SyntaxError: invalid syntax
برای حل این مشکل دو راه وجود دارد: ۱. استفاده از سه علامت نقل قول (”’ ”’ یا “”” “””). ۲. استفاده از کاراکتر فرار «بکاسلش» (\). اگر رشته را با تککوتیشن تعریف کردهاید، پیش از تککوتیشنهای داخل متن یک \ بگذارید، و اگر آن را با دابلکوتیشن ساختهاید، پیش از دابلکوتیشنهای داخلی علامت \ قرار دهید:
# راهکار اول: استفاده از سه کوتیشن
print('''He said, "What's there?"''')
# راهکار دوم: فرار از تک کوتیشن با بکاسلش
print('He said, "What\'s there?"')
# راهکار سوم: فرار از دابل کوتیشن با بکاسلش
print("He said, \"What's there?\"")
خروجی هر سه دستور یکسان و بدون خطا است:
He said, "What's there?"
He said, "What's there?"
He said, "What's there?"
جدول زیر فهرست کامل توالیهای فرار در پایتون و عملکرد هر کدام را نشان میدهد:
| توالی فرار | توضیحات |
|---|---|
| \newline | بکاسلش و خط جدید نادیده گرفته میشوند |
| \\ | بکاسلش (Backslash) |
| \’ | تک نقل قول (Single quote) |
| \” | جفت نقل قول (Double quote) |
| \a | اسکی بل (ASCII Bell) |
| \b | بکاسپیس اسکی (ASCII Backspace) |
| \f | فرمفید اسکی (ASCII Formfeed) |
| \n | خط جدید اسکی (ASCII Linefeed) |
| \r | بازگشت به عقب اسکی (ASCII Carriage Return) |
| \t | تب افقی اسکی (ASCII Horizontal Tab) |
| \v | تب عمودی اسکی (ASCII Vertical Tab) |
| \ooo | کاراکتر با مقدار مبنای هشت (ooo) |
| \xHH | کاراکتر با مقدار هگزادسیمال (HH) |
در کد زیر، سه نمونه کاربرد کاراکترهای فرار را برای چاپ مسیر فایل، ایجاد خط جدید و نمایش معادل هگزادسیمال کاراکترها مشاهده میکنید:
>>> print("C:\\Python32\\Lib")
C:\Python32\Lib
>>> print("This is printed\nin two lines")
This is printed
in two lines
>>> print("This is \x48\x45\x58 representation")
This is HEX representation

نادیده گرفتن توالی فرار با رشته خام (Raw String)
گاهی لازم است مفسر پایتون توالیهای فرار (علامتهای \) درون رشته را پردازش نکند و متن را دقیقاً به شکل نوشتهشده در نظر بگیرد. برای این کار، حرف r یا R را پیش از علامت نقل قول ابتدای رشته قرار میدهیم تا یک «رشته خام» (Raw String) ساخته شود.
تفاوت خروجی یک رشته معمولی و یک رشته خام را در مثال زیر ببینید:
# رشته معمولی (توالیهای فرار اجرا میشوند)
print("This is \x61 \ngood example")
# رشته خام با قرار دادن حرف r (توالیهای فرار نادیده گرفته میشوند)
print(r"This is \x61 \ngood example")
خروجی:
This is a
good example
This is \x61 \ngood example
کار با دادههای متنی و کلاس str در پایتون بر پایه درک ویژگی تغییرناپذیری رشتهها و نحوه دسترسی به کاراکترها با اندیسدهی و برشزنی استوار است. با استفاده از عملگرهای الحاق و تکرار، توابع توکاری مانند len() و enumerate()، ابزارهای قالببندی متن شامل f-string و format() و مدیریت کاراکترهای خاص به کمک توالیهای فرار، میتوانید رشتهها را بدون برخورد با خطاهای رایج در برنامههای خود مدیریت کنید.
