متدهای رشته در پایتون – از صفر تا صد
متدهای رشته در پایتون، به متدها و توابعی میگویند که برای کار با نوع داده رشته ساخته شدهاند. رشتهها قسمت جداییناپذیری از هر زبان برنامه نویسی هستند. به همین ترتیب، یکی از پُراستفادهترین نوعهای داده در زبان برنامه نویسی پایتون نیز بشمار میروند. رشتهها در کنار هم دنبالهها را تشکیل میدهند. بنابراین وقتی که در کنار یکدیگر قرار میگیرند میتوانند کلمات، جملات و حتی متنهای بزرگی را نیز ایجاد کنند. مانند هر زبان برنامهنویسی دیگری، پایتون هم پیادهسازی منحصربهفرد خود را از نوع داده رشته ارائه کرده است. رشتهها توالی از کارکترهای Unicode و غیرقابل تغییری هستند که درون کوتیشنهای تکی، دوتایی یا سهتایی محصور شدهاند. رشته غیرقابل تغییر به رشتهای میگویند که بعد از تعریف شدن دیگر امکان ایجاد تغییر در ساختار آن وجود نداشته باشد. در واقع، بهجای آن شیء رشته دیگری با تغییرات مورد نظر برنامه نویس ساخته میشود.
در این مطلب از مجله فرادرس، متدهای رشته در پایتون را بررسی میکنیم. این متدها در حوزه عملیات مربوط به اشیا کلاس String پراستفادهترین و مفیدترین ابزار در دسترس هستند. عملیاتی مانند چسباندن رشتهها، تجزیه مولفههای تشکیل دهنده رشته و تغییر اندازه حروف الفبا جزیی از موارد مورد بررسی در این مطلب خواهند بود. هر متد پایتونی که در این مطلب معرفی میکنیم، شامل توضیح کامل به همراه مثال کدنویسی شده برای درک بهتر موضوع شده است.
نکات کلیدی مربوط به متدهای رشته در پایتون
قبل از پرداختن به ادامه بحث، باید به دو نکته مهم توجه کنید.
- در این مطلب روی متدهای تعریف شده در پایتون۳ تمرکز کردهایم. پایتون۲ از تابع unicode() برای انجام کارهایی استفاده میکند که در این مطلب مورد بررسی قرار خواهیم داد. به همچنین بهیاد داشته باشید که کلاس قدیمی str() در پایتون۲ به کلاس bytes() در پایتون۳ تبدیل شده است.
در کادر زیر، مثالی از رشته سادهی پایتون را نمایش دادهایم.
1greeting = "Hello, World!"
- برعکس زبان برنامه نویسی جاوا یا هر زبان دیگری، پایتون از نوع داده کاراکتری پشتیبانی نمیکند. بنابراین کاراکتر تنهایی که درون علامتهای کوتیشن محصور شده است مانند "C" نیز هنوز شیء از جنس رشته به حساب میآید.
در پایتون کلاس bytes()، توالی غیرقابل تغییری از اشیا بایتی را برمیگرداند. این اشیا، پیشوندی به صورت کاراکتر b دارند و درون کوتیشن '' محصور شدهاند. به صورت کلی در شکل b'xxx' هستند. اگرچه، مانند رشتهها، بایتها هم میتوانند از کوتیشن تکی، دوتایی و سهتایی استفاده کنند.
چه متدهای رشته ای در پایتون وجود دارند؟
برای کار با رشتهها در پایتون تعداد زیادی متد وجود دارند که متد str.capitalize() و str.count() و str.center() ازجمله پرکاربردترین متدها هستند. با وجود این، تمامی این متدها در ادامه مطلب بیان میشوند و در انتها، جدول کاملی از متدهای رشته در پایتون آورده شده است.
همانطور که نوع دادههای مجموعه، لیست و دیکشنری در پایتون، متدهای کلاس مخصوص خود را دارند، تعداد بسیار زیادی متد «درونی» (Built-In) نیز برای کار با رشتهها وجود دارد. متدهای رشته در پایتون، مجموعهای از متدهای درونی هستند که برای مدیریت و کار با دادههای رشتهای ایجاد شدهاند. از آنجا که رشتههای پایتون غیرقابل تغییر هستند، همه این متدها در خروجی خود رشته جدیدی را برمیگردانند. در حالی که رشته قبلی -که به عنوان ورودی دریافت کردند- را به صورت دستنخورده و بدون تغییر در جای خود رها شده است.
تمام متدهای رشته بیان شده را در انتهای مطلب در جدولی همراه با توضیح مختصر برای هرکدام قرار دادهایم.
چگونه مهارت برنامه نویسی خود را در پایتون افزایش دهیم؟
متدهای رشته در پایتون، جزو متدهای مربوط به عملیات تخصصی در پایتون محسوب میشوند. از آنجا که پایتون زبان همه فن حریف و چندکاربردی هست تغریبا در هر زمینهای با رشتهها کار میکند. در صورت داشتن توانایی کار با متدهای رشته در پایتون فیلدهای شغلی و تخصصی زیادی در مقابل شما گشوده خواهد شد. زیرا تقریبا توانایی اخذ کردید که مصارف گوناگونی دارد. اوجود این مهارت نباید مانع از تلاش برای گسترش مهارتهای برنامهنویسی شود. یادگیری زبانهای برنامهنویسی به مرور افزایش مهارت، هم جذابتر میشود و هم کاربردیتر.
برای ادامه مسیر روشهای مختلفی وجود دارند که میتوانیم با توجه به شرایط خود، هر کدام را انتخاب کنیم. اما بهترین راه، استفاده از فیلمهای آموزشی است. زیرا فیلمهای آموزشی قابلیت بازبینی چندباره دارند، معمولا با کیفیت بالایی تولید میشوند و هزینه مقرون به صرفهتری را نیز به دانشجوها اعمال میکنند. در صورت علاقه مندی به دیدن مجموعه فیلمهای آموزشی فرادرس با کلیک بر روی تصویر بالا میتوانید به صفحه اصلی این مجموعه آموزشی مراجعه کرده و گزینه مورد نظر خود را پیدا کنید.
سایت فرادرس فیلمهای بسیار خوبی با کیفیت عالی در روش آموزش و متناسب با همه سطوح دانش را برای دانشجویان فراهم کرده است. این فیلمهای آموزشی با دقت و حساسیت بالایی در انتخاب استاد و روش تدریس و حتی کیفیت مطالب مورد تدریس تولید شدهاند. اگر که علاقهمند به افزایش مهارت خود در زبان برنامهنویسی پایتون هستید، فیلمهای آموزشی زیر میتوانند گزینه خوبی برای شروع باشند.
- فیلم آموزش برنامه نویسی تابعی در پایتون فرادرس
- فیلم آموزش برنامه نویسی شی گرا در پایتون فرادرس
- فیلم آموزش برنامه نویسی ترفندهای پیشرفته پایتون در فرادرس
- فیلم آموزش تجزیه و تحلیل و آماده سازی داده ها با پایتون در فرادرس
نوع Text Sequence و کلاس str
String-ها یکی از نوع دادههای درونی پایتون هستند. به این معنا که نوع داده رشته در پایتون مانند سایر نوعهای داده به مفسر پایتون معرفی شدهاند.
متن نوشته شده در زبان برنامهنویسی پایتون توسط اشیا کلاس String یا «ثابتهای عینی رشتهای« (String Literals) ساخته میشود. ثابتهای رشتهای در پایتون را میتوان با کمک کوتیشنهای تکی' ' ، دوتایی" " یا سهگانه""" """ نوشت. وقتی که برای تعریف ثابتهای رشته از کوتیشن تکی استفاده کنیم، در متن درون رشته میتوان به صورت نهفته از کوتیشن دوتایی استفاده کرد بدون اینکه هیچ خطایی ایجاد شود و برعکس همین اتفاق هم ممکن است. کوتیشنهای سهگانه برای نوشتن متنهای طولانی در چند خط مختلف استفاده میشوند. در این متنها برای رفتن به خط بعدی نیازی به استفاده از کاراکتر «Backslash» \ وجود ندارد.
ثابت عینی: به نماد و کاراکتری میگویند که دقیقا معنای خودش را میدهد.
در ادامه برای هر کدام از روشهای تعریف رشته، مثالی را ارائه دادهایم.
- در کادر زیر ثابت عینی رشتهای را با استفاده از کوتیشن تکی به متغیری تخصیص دادهایم.
1string_one = 'String one'
- در کادر زیر ثابت عینی رشتهای را با استفاده از کوتیشن دوتایی به متغیری تخصیص دادهایم.
1string_two = "String two"
- در کادر زیر ثابت عینی رشتهای را با استفاده از کوتیشن سهگانه به متغیری تخصیص دادهایم.
1string_three = """
2This string covers
3more than one
4line.
5"""
میتوان اشیائی از نوع دادههای دیگر را با استفاده از متد سازنده str()به رشته تبدیل کرد. متد سازنده str() از شیئی که به عنوان آرگومان تحویل گرفته، نسخه رشتهای قابل چاپی را برمیگرداند.
از کلاس str میتوان برای ساخت اشیا رشتهای کمک گرفت. متد سازنده str() در واقع به صورت زیر این فرایند اجرا میشود.
- در ابتدا این متد سازنده، شیئی را به عنوان آرگومان تحویل میگیرد.
- سپس به صورت ضمنی متد داندر سازنده __str__() آن کلاس را فراخوانی میکند تا با کمک آن نمای رشتهای از آن شیء را برگرداند.
در کادر زیر با کمک مثال سادهای، روش استفاده از str() را برای ساخت رشته نمایش دادهایم.
1number = 23
2print(number, 'is an object of ', type(number))
3print(dir(number))
4number = str(number)
5print(number, 'is an object of ', type(number))
با اجرای کد بالا، محتویات کادر زیر در خروجی به کاربر نمایش داده میشود.
23 is an object of <class 'int'> 23 is an object of <class 'str'>در کد بالا، نوع داده متغیر number در ابتدا از نوع int بود. اما بعدا با استفاده از متد سازنده str()به رشته تبدیل شد. هر شیء در پایتون، متد داندر str() مخصوص به خود را دارد که میتواند با بهکار بردن این متد نسخه رشتهای از خود را بسازد.
با نگاه سادهای به مشخصات و متدهای هر شیء، همراه با تابع درونی dir() ، میتوان متد __str__() را نیز در میان سایر متدها دید. همینطور که در مثال زیر دیده میشود، با فراخوانی متد __str__() هر شیء خاصی به صورت صریح، میتوان نسخه رشتهای از روی آن شیئی ایجاد کرد.
1price = 15.25
2print(dir(price))
3print(type(price))
4print(type(price.__str__()))
خروجی حاصل از اجرای کد بالا به صورت زیر است.
[... '__sizeof__', '__str__', '__sub__', ...] <class 'float'> <class 'str'>
مرور کلی بر روی متدهای رشته در پایتون
از آنجا که رشتهها در پایتون به عنوان توالی در نظر گرفته میشوند، همه عملیات مربوط به توالیها مانند الحاق، قطع کردن، تکه تکه کردن و غیره هم، برای رشتهها پیادهسازی شدهاند.
1>>> word = 'golden'
2>>> len(word)
36
4>>> word + 'age'
5'goldenage'
6>>> 'la' * 3
7'lalala'
8>>>
جدا از عملیات مربوط به توالی بر روی رشتهها، در ارتباط با اشیا رشتهای متدهای بیشتر دیگری نیز وجود دارند. بعضی از این متدها در موارد مختلف مانند گزینههای فهرست شده در پایین کاربرد دارند.
- در زمینه قالببندی رشتهها
- جستوجو به دنبال زیررشته خاصی در درون رشتهای دیگر
- زدودن فضاهای خالی دوروبر رشته
- انجام بررسیهای مشخصی بر روی رشته گرفته شده
- و غیره
لازم به یادآوری است که این متدهای رشتهای، رشته اصلی را تغییر نمیدهند.
از آنجا که در پایتون، رشته به عنوان نوع داده غیرقابل تغییر تعریف شده است، در اشیا رشتهای تعریف شده ایجاد تغییر غیرممکن است. بیشتر متدهای رشته در پایتون، در واقع کپی تغییر یافتهای از رشته اصلی را برمیگردانند. بعضی از متدها هم با توجه به شرایط شاید فقط مقداری از نوع داده بولین را به عنوان جواب برگردانند.
در ادامه مطلب چند مورد از متدهای رشتهای را که در جدول بالا دیدیم همراه با مثال، معرفی و بررسی میکنیم.
متدهای رشته در پایتون که کپی تغییر یافته ای از رشته را برمی گردانند
در این بخش میخواهیم چند مورد از متدهای رشتهای را بررسی کنیم. متدهای مورد بررسی، از نوع متدهایی هستند که به عنوان خروجی نسخهی کپی تغییریافتهای از روی رشته اصلی را برمیگردانند.
۱. متد str.capitalize
این متد، نسخه کپی شدهای از رشته اصلی را برمیگرداند که در آن حرف اول کلمه به شکل بزرگ و باقی کاراکترها به شکل حروف کوچک نوشته شدهاند.
در کادر زیر مثال کدنویسی شدهای از رفتار متد str.capitalize() را مشاهده میکنیم.
1>>> "i Enjoy traveling. Do you?".capitalize()
2'I enjoy traveling. do you?'
3>>>
۲. متد str.center
شکل کامل پایه این متد به صورت str.center(width[, fillchar]) است. با کمک این متد، کپی از رشته دریافت شده را به صورتی برمیگردانیم که در وسط کاراکترهای fillchar مشخص شده قرار گرفته باشد. این کاراکترها به اندازه عرض مشخص شده width در دوطرف رشته تکرار میشوند. اگر عرض تعیین شده، کمتر یا مساوی طول رشته len(s) باشد، همان رشته اصلی برگردانده میشود.
متد str.center() دو پارامتر دریافت میکند.
- width : پارامتر width اندازه طول رشته را همراه با کاراکترهای پوشاننده رشته از دو طرف نشان میدهد.
- fillchar : پارامتر fillchar ، پارامتر اختیاری است که برای تعیین کاراکتری استفاده میشود که نقش پوشاننده را دارد.
کد زیر مثالی را در ارتباط با متد str.center(width[, fillchar]) نمایش میدهد.
1>>> sentence = 'i Enjoy traveling. Do you?'
2>>> len(sentence)
326
4>>> sentence.center(31)
5' i Enjoy traveling. Do you? '
6>>> sentence.center(30)
7' i Enjoy traveling. Do you? '
۳. متد str.encode
شکل پایه این متد به صورت str.encode(encoding=’utf-8′, errors=’strict’) است. این متد رشتهای را برمیگرداند که با بایتها رمزنگاری شده است.
به صورت پیشفرض، رشتههایی که به توابع ارسال میشوند براساس UFT-8 کدگذاری میشوند. در مواقعی که خطای مرتبطی رخ دهد، خطای استثنای UnicodeEncodeError فراخوانده میشود. آرگومان کلیدی errors روش مدیریت خطاها را مشخص میکند. مثلا کلمه کلیدی strict باعث فراخوانی استثنای خاصی میشود یا ignore هر خطایی که با آن روبهرو شود را نادیده میگیرد. به همین ترتیب روشهای مختلفی برای مدیریت خطاها وجود دارند. گزینههای دیگری نیز برای کدگذاری رشتهها وجود دارند.
در مثال پایین، میتوانید کدگذاری بر اساس ASCII را همراه با روشی برای مدیریت خطا ببینید.
1>>> sentence = "i Enjoy traveling. Do you, 山本さん?"
2>>> sentence.encode()
3b'i Enjoy traveling. Do you, \xe5\xb1\xb1\xe6\x9c\xac\xe3\x81\x95\xe3\x82\x93?'
4>>> sentence.encode(encoding='ascii')
5Traceback (most recent call last):
6 File "<stdin>", line 1, in <module>
7UnicodeEncodeError: 'ascii' codec can't encode characters in position 27-30: ordinal not in range(128)
8>>> sentence.encode(encoding='ascii', errors='replace')
9b'i Enjoy traveling. Do you, ?????'
۴. متد str.format
این متد پارامترهای خاصی را میپذیرد که در حالت پایه میتوان به شکل str.format(*args, **kwargs) نمایش داد. متد str.format() به عنوان جواب نسخه کپی شده از رشتهای را برمیگرداند. در این نسخه جدید، هر فضای تعیین شدهای توسط مقدار رشتهای آرگومان مربوط به آن فضا جایگزین میشود.
به عبارت سادهتر، رشتهای که توسط این متد استفاده میشود، شامل فضایی برای متن ثابت و قسمتی به عنوان «فضای جایگزینی» (Replacement Field) است. متن ثابت بدون تغییر در رشته باقی میماند. در واقع مانند ثابت عینی استفاده میشود. اما فضای جایگزینی با استفاده از آکولاد {} مشخص میشود. هر فضای جایگزینی، درون خود، شمارهای برای شناسایی موقعیت آرگومان یا نامی به عنوان کلمه کلیدی آرگومان دارد. مقادیر تعیین شده به عنوان پارامتر در متد str.format() در درون جایگاه این آکولادها قرار میگیرند.
آکولادها به عنوان «نگهدارنده جا» (Placeholder) برای موقعیت پارامترهای *args و یا آرگومانهای کلمه کلیدی **kwargs استفاده میشوند. پارامترهای *args و **kwargs از قبل به متد str.format() ارسال شدهاند.
1>>> "I bought {0} apples and the cost {1:.2f} Ghana cedis.".format(2, 18.70)
2'I bought 2 apples and the cost 18.70 Ghana cedis.'
3>>> "My name is {first_name}, and I'm a {profession}.".format(first_name='Ben', profession='doctor')
4"My name is Ben, and I'm a doctor."
5>>>
در مثال بالا {0} نگهدارنده مکان برای اولین آرگومان 2 در متد format() است. مکان بعدی {1:.2f} است که به عنوان جایگاهی برای مقدار 18.70 تعریف شده است. علامت .2f نشان میدهد که خروجی باید عدد اعشاری را با بیشینه دو رقم اعشار نمایش دهد.
کلمات first_name و profession، نگهدارندههای مکان برای آرگومانهای کلیدی هستند که به متد format() ارسال شدهاند.
با توجه به مثال بالا، بهتر میتوانید مطلب نوشته شده را متوجه شوید. اما برای درک بهتر به مثالی درباره کارکرد F-String نیز توجه کنید.
1num = 1
2language = 'Python'
3s = f'{language} is the number {num} in programming!'
4# 'Python is the number 1 in programming!'
روش قالببندی F-String برای رشتهها از پایتون۳٫۶ به بعد ارائه داده شده است. این تکنیک مدرنتر است. با این روش شکل رشتههای قالببندی شده بسیار خواناتر و کوتاهتر شدهاند. در ضمن نوشتن این نوع قالب برای رشتهها بسیار سریعتر هم انجام میشود.
۵. متد str.lower
این متد، کپی از رشته اصلی را برمیگرداند که در آن همه کاراکترهای الفبا به شکل حروف کوچک قرار داده شدهاند. به عبارت دیگر، حروف الفبای موجود در کل رشته را با حروف الفبای انگلیسی کوچک بازنویسی میکند.
در مثال زیر روش کار این متد را نمایش دادهایم.
1>>> 'i Enjoy traveling. Do you?'.lower()
2'i enjoy traveling. do you?'
3>>>
۶. متد str.removeprefix
این متد دو پارامتر میپذیرد و شکل پایه آن به صورت str.removeprefix(prefix, /) است. متد str.removeprefix() کپی از رشته را با حذف پیشوند مشخص شده برمیگرداند. اگر پیشوند مشخص شده در رشته پیدا نشود، متد str.removeprefix()خودِ رشته اصلی را برمیگرداند.
در کادر زیر، مثال سادهای از عملکرد این متد را نمایش دادهایم.
1>>> 'i Enjoy traveling. Do you?'.removeprefix('i')
2' Enjoy traveling. Do you?'
3>>>
۷. متد str.removesuffix
این متد دو پارامتر میپذیرد و شکل پایه آن به صورت str.removesuffix(suffix, /) است. متد str.removesuffix() کپی از رشته را با حذف پسوند مشخص شده برمیگرداند. اگر پسوند مشخص شده در رشته پیدا نشود، متد str.removesuffix()خودِ رشته اصلی را برمیگرداند.
در کادر زیر، مثال سادهای از عملکرد این متد را نمایش دادهایم.
1>>> 'i Enjoy traveling. Do you?'.removesuffix('Do you?')
2'i Enjoy traveling. '
3>>>
۸. متد str.replace
متد Replace در پایتون هم دو پارامتر مختلف میپذیرد. شکل پایه این متد به صورت str.replace(old, new[, count]) است. متد str.replace() نسخه کپی شدهای از رشته اصلی را برمیگرداند که در آن همه رخدادهای زیررشته مشخص شده با زیررشته جدید جایگزین شدهاند. اگر آرگومان count داده شده بود، فقط باید به تعداد count عدد از رخدادها جایگزین شوند. آرگومان count اختیاری است.
در مثال زیر، روش استفاده از این متد را به صورت ساده و کاملی نمایش دادهایم.
1>>> 'i Enjoy traveling. Do you?'.replace('Enjoy','dislike')
2'i dislike traveling. Do you?'
3>>> 'Things fall apart'.replace('a','e',1)
4'Things fell apart'
5>>>
۹. متد str.strip
این متد به عنوان ورودی لیستی از کاراکترها را دریافت میکند. str.strip([chars]) بعد از حذف کاراکترهای مشخص شده در ورودی از ابتدا و انتهای رشته اصلی، رشته نهایی را برمیگرداند. اگر که آرگومان chars به متد str.strip() ، ارائه نشده باشد، به صورت پیشفرض، کاراکترهای مربوط به «فضای خالی» (Whitespace) را از رشته حذف میکند.
متد str.strip()بهجای اینکه بر روی رشتهها تمرکز کند، عملیات خود را به صورت کاراکتر محور انجام میدهد. یعنی هر رشته را کاراکتر به کاراکتر پیمایش کرده و تا انتهای رشته پیش میرود.
در مثال پایین، سه نوع مختلف از ارسال کاراکتر به متد str.strip() را نمایش دادهایم.
1>>> word1 = ' whitespace '.strip()
2>>> word1
3'whitespace'
4>>> word2 = 'exercise'.strip('e')
5>>> word2
6'xercis'
7>>> word3 = 'chimpanze'.strip('acepnz')
8>>> word3
9'him'
10>>>
همانطور که در مثال بالا دیده میشود، وقتی که برای آرگومان chars مقدار خاصی را تعریف نکردهایم، کاراکتر فضای خالی درون word1 حذف میشود. وقتی که از متد str.strip() همراه با آگومان e بر روی رشتهای که درون متغیر word2 قرار گرفته استفاده میکنیم، کاراکترهای ابتدایی و انتهایی رشته که برابر با e هستند در مقداری که به عنوان جواب از متد برگشت داده میشود حذف خواهند شد.
در متغیر word3 چند کاراکتر تصادفی را به عنوان آرگومان به متد ارسال کردهایم. این کاراکترها از ابتدا و انتهای رشته جواب حذف شدهاند. تا جایی که کاراکترهایی در رشته ماندهاند که با هیچکدام از کاراکترهای درون آرگومان همخوانی ندارند.
۱۰. متد str.title
این متد کپی از رشته را برمیگرداند که در آن هر کلمه با یک حرف الفبا بزرگ شروع میشود و باقی کاراکترهای کلمات همه با حروف کوچک نوشته شدهاند.
متد str.title() اولین کاراکتر هر کلمه در رشته دریافت شده را به حرف بزرگ الفبا تبدیل میکند. البته مشخص است که این متد بر روی رشتههای نوشته شده به زبان فارسی اجرا نمیشود. این متد بر روی حرف تعریف معین مانند «The»، حروف اضافه زبان و غیره هم به همین ترتیب کار میکند.
در مثال زیر، بهسادگی روش استفاده از این متد را نمایش دادهایم.
1>>> 'i Enjoy traveling. Do you?'.title()
2'I Enjoy Traveling. Do You?'
3>>>
۱۱. متد str.upper
این متد، نسخه کپی شدهای از رشته را برمیگرداند که در آن همه حروف الفبا با مقادیر شکل بزرگ خودشان جایگزین شدهاند. متد str.upper یکی از سادهترین روشهای استفاده را دارد که در ادامه نمایش دادهایم.
1>>> 'i Enjoy traveling. Do you?'.upper()
2'I ENJOY TRAVELING. DO YOU?'
3>>>
۱۲. متد re.sub
یکی دیگر از روشهای جایگزینی، استفاده از تابع مخصوص sub() است. اگر بخواهیم که الگوی خاصی را بهجای کاراکتر دیگری جایگزین کنیم میتوانیم با کمک تابع sub() که در ماژول re پایتون تعریف شده همراه با عبارت منظم مربوط به الگو این کار را انجام دهیم.
به کمک ماژول تخصصی re میتوانیم در پایتون با رجکسها کار کنیم. رجکسها یا عبارتهای با قاعده، یکی از ابزار تخصصی کار با رشتهها هستند. درون ماژول re متدها و توابع گوناگونی قرار گرفتهاند که به صورت تخصصی برای قالببندی یا جستوجو و سایر عملیات رایج به روی رشتهها کار میکنند. برای آشنایی با رجکسها میتوانید مطلب RegEx چیست؟ عبارت های با قاعده به زبان ساده را از مجله فرادرس را مطالعه کنید.
در مثال زیر، شکل سادهای از استفاده این تابع را پیادهسازی کردهایم.
1import re
2s = "string methods in python"
3s2 = re.sub("\s+" , "-", s)
4# 'string-methods-in-python'
متدهای رشته در پایتون برای ترکیب و تجزیه
برای کار با متدهای رشته در پایتون باید توجه کنیم که کدهای نوشته شده در بهینهترین حالت ممکن برای رسیدن سریع به جواب و کم کردن هزینه منابع مصرف شده در سیستم باشند. یکی از بهترین روشهای بهینهسازی کدهای پایتون استفاده مستقیم از متد مربوط به هر عملیات به جای استفاده از روشهای تعریف کد به صورت شخصیسازی شده است. اما برای افزایش بیشتر مهارت کدنویسی به صورت بهینه پیشنهاد میکنیم که فیلم آموزش تکمیلی برنامه نویسی پایتون درباره بهینه کردن کدها را از فرادرس مشاهده کنید. برای راحتی بیشتر کار لینک مربوط به این فیلم را در ادامه قرار دادهایم.
در این بخش از مطلب، به سراغ گروهی از متدهای رشته در پایتون رفتهایم که برای الحاق رشتههای مجزا به هم یا تجزیه و قطعهقطعهکردن رشتهها به زیر رشتههای کوچکتر تشکیل دهنده آنها استفاده میشود. این سری از عملیات بر روی متنهای بزرگ و کلمات بسیار کاربرد دارد و در حوزه تحلیل متن، متدهای پر کاربردی هستند.
۱. متد str.join
متد str.join() پارامتر ورودی از جنس ساختار ذخیره داده پیمایشپذیری -iterable - مانند لیست، میپذیرد. با کمک متد str.join(iterable) رشتهای را برمیگرداند که از الحاق همه رشتههای درون شیء «پیمایشپذیر» (Iterable) تشکیل شده است. اگر در شیء پیمایشپذیر، مقادیر غیر رشتهای وجود داشته باشد، باعث برخواستن خطای TypeError میشود.
1>>> words = ["Accra", "is", "a", "beautiful", "city"]
2>>> ' '.join(words)
3'Accra is a beautiful city'
4>>> names = ['Abe', 'Fred', 'Bryan']
5>>> '-'.join(names)
6'Abe-Fred-Bryan'
7>>>
۲. متد str.split
شکل پایه سینتکس این متد به صورت str.split(sep=None, maxsplit=- 1) است. این متد لیستی از کلمات یا کاراکترها را برمیگرداند. در واقع، رشتهای را که به این متد ارسال شده را با توجه به جداکننده مورد نظر به اجزای کوچکتر تجزیه میکند.
همینطور که در تعریف متد str.split(sep=None, maxsplit=- 1) دیده میشود، این متد، دو پارامتر اصلی میپذیرد.
- sep : جداکنندهای که محل جدا کردن تکههای رشته را از هم نشان میدهد. این پارامتر اختیاری است. در صورتی که به پارامتر sepمقداری اختصاص داده نشود به صورت پیشفرض، متد از کاراکتر فضای خالی به عنوان جداکننده استفاده میکند.
- maxsplit : تعداد بیشترین دفعات مجاز برای اجرای عمل تجزیه رشته را نشان میدهد. این پارامتر هم اختیاری است. در صورتی که برای این پارامتر مقداری تعیین نشود، به صورت پیشفرض کل رشته اصلی را از ابتدا تا به انتها پیمایش کرده و هربار که با جداکننده روبهرو شد تکهای از رشته را جدا میکند.
در کادر زیر، با دو مثال کوچک روش کار متد str.split() را نمایش دادهایم.
1>>> 'i Enjoy traveling. Do you?'.split()
2['i', 'Enjoy', 'traveling.', 'Do', 'you?']
3>>> 'i Enjoy traveling. Do you?'.split(' ', 2)
4['i', 'Enjoy', 'traveling. Do you?']
5>>>
۳. متد str.partition
متد str.partition() هم مانند متد str.split() برای تقسیم کردن رشته به تکههای کوچکتر استفاده میشود.
تفاوت بین متد str.partition و متد str.split
متد str.split() رشتهای را به شکل قطعات کوچکتر، تقسیم کرده و درون لیستی قرار میدهد. هر کدام از زیر رشتههای جدا شده به عنصر مجزایی در لیست جواب تبدیل میشوند. به صورت پیشفرض هم از کاراکتر فضای خالی به عنوان جداکننده استفاده میکند. البته که در صورت تمایل هر جداکنندهای را میتوانیم معرفی کنیم.
برای مثال، متد str.split(“,”) رشته str را با توجه به علامتهای کاما, تکهتکه میکند.
از طرف دیگر متد str.partition() به دنبال زیررشته مشخصی میگردد. رشته اصلی را به سه قسمت مختلف تقسیم کرده و در تاپل پایتونی قرار میدهد.
- عنصر اول در تاپل، قسمتی از رشته را نشان میدهد که قبل از زیررشته مورد نظر قرار گرفته بود.
- عنصر دوم تاپل، همان زیررشته مشخص شده است.
- و عنصر سوم تاپل هم شامل قسمتی از رشته میشود که بعد از زیررشته مشخص شده قرار گرفته بود.
برای مثال، متد str.partition(” “) در خروجی تاپلی را با سه عنصر برمیگرداند. عنصر اول در تاپل از ابتدای رشته شروع شده و تا اولین فضای خالی در رشته را شامل میشود. عنصر دوم در تابع، کاراکتر فضای خالی " " است. و عنصر سوم تاپل، شامل تمام قسمت رشته بعد از اولین کاراکتر فضای خالی میشود.
توجه: اگر زیررشتهای که مشخص شده در متد str.partition()در رشته اصلی پیدا نشد، این متد به عنوان خروجی تاپلی با سه عنصر را برمیگرداند. عنصر اول خود رشته و دو عنصر بعدی تاپل را رشتههای خالی تشکیل میدهند.
1s = 'Python is awesome!'
2parts = s.partition('is')
3# ('Python ', 'is', ' awesome!')
4
5parts = s.partition('was')
6# ('Python is awesome!', '', '')
متدهای رشته در پایتون برای اجرای عملیات جست وجو
در این بخش از مطلب، به بررسی متدهایی میپردازیم که برای اجرای عملیات جستوجو یا پیمایش بر روی رشته استفاده میشوند. با کمک این متدها بر روی رشتهها تغییر خاصی ایجاد نمیکنیم، در عوض اطلاعاتی درباره رشتهها بدست میآوریم.
برای یادگیری پایتون روشهای مختلفی وجود دارد. بهترین این روشها دیدن فیلمهای آموزشی با اساتید قوی و کیفیت بالا است. برای انتخاب فیلمهای آموزشی نیز باید دقت زیادی صرف کنیم. یکی از گزینههای مناسب تماشای فیلمهای آموزشی پروژه محور است. برای اینکه با رشتهها که ماهیت کلاسی دارند بهتر آشنا شوید پیشنهاد میکنیم که فیلم آموزش پروژه محور شی گرایی همراه با هفت پروژه کاربردی در Python را تماشا کنید. برای راحتی کار لینک مربوط به این فیلم را در ادامه قرار دادهایم.
۱. متد str.count
شکل پایه این متد به صورت str.count(sub[, start[, end]]) است. با کمک این متد تعداد دفعاتی را که زیررشتهای درون رشته اصلی ظاهر میشود را بدست میآوریم. متد str.count() دو آرگومان اختیاری ابتدا start و انتها end را میپذیرد. با کمک این آرگومانها محل شروع و پایان عملیات جستوجو و شمارش را بر روی رشته اصلی تعییین میکنیم. در صورت ندادن مقدار مشخصی به این آرگومانها این متد تمام رشته اصلی را از ابتدا تا انتها بررسی میکند.
سادهترین حالت استفاده از این متد را در مثال زیر نمایش دادهایم.
1>>> 'i enjoy traveling. do you?'.count('e')
22
3>>>
۲. متد str.find
شکل پایه این متد به صورت str.find(sub[, start[, end]]) است. این متد شماره ایندکس اولین محل ظهور زیررشته مورد نظر در رشته اصلی را برمیگرداند. با کمک پارامتر s[start:end] میتوانیم تکه خاصی از رشته اصلی را برای جستوجو مشخص کنیم. اگر زیر رشته مورد نظر پیدا نشد، متد مقدار -1 را به خروجی ارسال میکند.
تابع Find در پایتون از تکنیک «قطعهقطعهسازی» «Slicing» برای پیداکردن زیررشتهای درون زیررشته دیگر استفاده میکند. تکنیک قطعهقطعهسازی در پایتون به معنای استخراج زیررشتهها و زیرتوالیها از یک رشته یا توالی بزرگتر است. در این مورد خاص با استفاده از نقاط شاخص ابتدا startو انتها stop زیررشته را درون رشته دیگری پیدا میکنیم.
یک قطعه در پایتون با کد زیر تعریف میشود.
1sequence[start:stop]
اگر در زمان کار با متد find() مقداری برای پارامترهای ابتدا startو انتها stopتعیین نشده بود، عملیات جستوجو از ابتدای رشته تا انتهای آن انجام میشود. وقتی که زیر رشته مورد نظر پیدا شد، متد عدد Integer را برمیگرداند که شماره ایندکس اولین کاراکتر زیر رشته را نشان میدهد.
این متد سه پارامتر اصلی دریافت میکند.
- sub : زیر رشتهای که در رشته اصلی باید به دنبال آن بگردیم.
- start: محل شروع جستوجو را نشان میدهد. این پارامتر اختیاری است.
- end : محل توقف جستوجو را نشان میدهد. این پارامتر نیز اختیاری است.
در کادر زیر دو مثال مختلف را برای اجرای متد find() نمایش دادهایم.
1>>> 'i Enjoy traveling. Do you?'.find('traveling')
28
3>>> 'I live in Accra Ghana'.find('acc', 8, 16)
4-1
5>>>
۳. متد str.index
شکل پایه این متد به صورت str.index(sub[, start[, end]]) است. متد str.index() شماره ایندکس زیررشتهای را از درون رشته اصلی برمیگرداند. این متد دقیقا مانند متد find() کار میکند، به غیر از اینکه در زمان پیدا نشدن زیر رشته خطای استثنای ValueError را به کاربر در خروجی ارسال میکند.
متد str.index() سه پارامتر دریافت میکند.
- sub: زیر رشتهای که در رشته اصلی باید به دنبال آن بگردیم.
- start: محل شروع جستوجو را نشان میدهد. این پارامتر اختیاری است.
- end: محل توقف جستوجو را نشان میدهد. این پارامتر نیز اختیاری است.
در کادر زیر مثالی از جستوجو به دنبال زیر رشته ناموجود در رشته اصلی را نمایش دادهایم.
1>>> 'i Enjoy traveling. Do you?'.index('car')
2Traceback (most recent call last):
3 File "<stdin>", line 1, in <module>
4ValueError: substring not found
5>>>
همینطور که در کد بالا مشاهده میکنیم، به دلیل اینکه زیر رشته car در رشته اصلی وجود ندارد، خطای استثنا ValueError در مقابل کاربر اعلام شده است.
متدهای رشته در پایتون با خروجی Boolean
در این بخش از مطلب، نوعی از متدهای رشته در پایتون را بررسی میکنیم که در جواب مقادیر Boolean برمیگردانند، True یا False.
۱. متد str.endswith
شکل پایه این متد به صورت str.endswith(suffix[, start[, end]]) است. در این متد، اگر رشته با پسوندی که مشخص کردهایم به پایان برسد مقدار True و در غیر این صورت مقدار False برگشت داده میشود.
پارامتر متد suffix[, start[, end]] به معنای این است که عمل جستوجو از ابتدای رشته اصلی یا شماره ایندکسی که کاربر مشخص کرده start شروع میشود و در انتهای رشته اصلی یا شماره ایندکس مشخص شده توسط کاربر endبه پایان میرسد.
متد str.endswith() سه پارامتر دریافت میکند.
- sub: رشته یا تاپلی که در رشته اصلی باید به دنبال آن بگردیم.
- start: محل شروع جستوجو را برای یافتن پسوند موردن نظر، نشان میدهد. این پارامتر اختیاری است.
- end: محل توقف جستوجو را برای یافتن پسوند موردن نظر، نشان میدهد. این پارامتر نیز اختیاری است.
در کادر زیر مثال سادهای از اجرای این متد را نمایش دادهایم.
1>>> 'i Enjoy traveling. Do you?'.endswith('you?')
2True
3>>>
۲. متد str.isalnum
اگر در رشته مورد نظر کاراکترهای «حرفی-عددی» (Alphanumeric)، حداقل به اندازه یک کاراکتر وجود داشته باشد، متد str.isalnum مقدار Trueو در غیر این صورت مقدار False برمیگرداند.
1>>> 'i Enjoy traveling. Do you?'.isalnum()
2False
3>>>
۳. متد str.isalpha
اگر همه کاراکترهای تشکیل دهنده رشته از نوع الفبای انگلیسی باشند، این متد در جواب مقدار Trueو در غیر این صورت مقدار Falseبرمیگرداند.
1>>> "Python".isalnum()
2True
3>>> "Python.".isalnum()
4False
5>>> "パイソン".isalnum()
6True
7>>> "パイソン。".isalnum()
8False
9>>>
۴. متد str.isascii
اگر همه کاراکترهای درون رشته از نوع کاراکترهای ASCII باشند یا رشته خالی باشد، این متد مقدار Trueبرمیگرداند و در غیر این صورت مقدار Falseبرگردانده میشود.
در کد زیر دو مثال مختلف از این متد را پیادهسازی کردهایم.
1>>> 'i Enjoy traveling. Do you?'.isascii()
2True
3>>> "体当たり".isascii()
4False
5>>>
۵. متد str.isdecimal
اگر کاراکترهای رشته مورد نظر همه از جنس عددی باشند و حداقل یک کاراکتر وجود داشته باشد، متدstr.isdecimal() مقدار Trueو در غیر این صورت مقدار Falseبرمیگرداند.
هر دو حالت را در کد زیر پیادهسازی کردهایم.
1>>> 'i Enjoy traveling. Do you?'.isdecimal()
2False
3>>> '10'.isdecimal()
4True
5>>>
۶. متد str.isnumeric
اگر کاراکترهای رشته مورد نظر همه از جنس رقم باشند و حداقل یک کاراکتر وجود داشته باشد، متد str.isnumeric() مقدار Trueو در غیر این صورت مقدار Falseبرمیگرداند.
در مثال زیر انواع رشته مختلف را با این متد آزمایش کردهایم.
1>>> 'i Enjoy traveling. Do you?'.isnumeric()
2False
3>>> '1000.04'.isnumeric()
4False
5>>> '1000'.isnumeric()
6True
7>>>
۷. متد str.islower
اگر همه کاراکترهای رشته از حروف الفبای کوچک انگلیسی تشکیل شده باشند و حداقل یک کاراکتر وجود داشته باشد، این متد به عنوان جواب در خروجی مقدار Trueبرمیگرداند. در غیر این صورت متد str.islower() به عنوان جواب مقدار Falseرا به خروجی برمیگرداند.
در مثال زیر، هر دو صورت جواب را پیادهسازی کردهایم.
1>>> 'i Enjoy traveling. Do you?'.islower()
2False
3>>> 'i enjoy traveling. do you?'.islower()
4True
5>>>
۸. متد str.isupper
اگر همه کاراکترهای رشته از حروف الفبای بزرگ انگلیسی تشکیل شده باشند و حداقل یک کاراکتر وجود داشته باشد، این متد به عنوان جواب در خروجی مقدار Trueو در غیر این صورت مقدار Falseبرمیگرداند. در مثال زیر، هر دو صورت جواب را پیادهسازی کردهایم.
1>>> 'i Enjoy traveling. Do you?'.isupper()
2False
3>>> 'I ENJOY TRAVELING. DO YOU?'.isupper()
4True
5>>>
۹. متد str.startswith
صورت کلی این متد در حالت پایه به شکل str.startswith(prefix[, start[, end]]) است. اگر رشته مورد نظر با پیشوند مشخص شده شروع شود، متد str.startswith() به عنوان جواب در خروجی مقدار Trueبرمیگرداند و در غیر این صورت به خروجی مقدار False را ارسال میکند.
همینطور که در حالت پایه متد دیده میشود، متد str.startswith()، ۳ پارامتر مختلف را میپذیرد.
- suffix : رشته یا تاپلی که در رشته اصلی باید به دنبال آن بگردیم.
- start: محل شروع جستوجو را برای یافتن پیشوند موردن نظر، نشان میدهد. این پارامتر اختیاری است.
- end: محل توقف جستوجو را برای یافتن پیشوند موردن نظر، نشان میدهد. این پارامتر نیز اختیاری است.
1>>> 'i Enjoy traveling. Do you?'.startswith('i')
2True
3>>>
آموزش های تکمیلی پایتون با فرادرس
بعد از اینکه مهارتهای خود را در کار بل زبان برنامهنویسی پایتون در حد مناسبی ارتقا دادیم، برای اینکه توانایی خود را افزایش دهیم و متوجه شویم چه بخشهایی از دانش برنامهنویسی خود را باید تکمیل کنیم، بهترین کار بررسی دورههای حرفهایتر است. حتی استفاده از متدهای رشته در پایتون برای پیادهسازی پروژههای عملی باعث نهادینه شدن دانش مربوط به کار با رشتهها در برنامهنویسان میشود. بنابراین، بهترین روش برای تقویت تواناییها و ترکیب تکنولوژیهای مختلف در برنامهنویسی انجام پروژههای هرچه نزدیکتر به سناریوهای دنیای واقعی است.
به این منظور وبسایت آموزشی فرادرس، فیلمهای بسیار خوبی درباره آموزش پروژه محور زبانهای برنامهنویسی تولید و ارائه کرده است. در این بخش از مطلب سه مورد از این فیلمها را در ارتباط با پروژههای واقعی زبان برنامهنویسی پایتون معرفی کردهایم.
- فیلم آموزش پیش بینی نوسانات بازار سهام با هوش مصنوعی در فرادرس
- فیلم آموزش بازی سازی در پایتون با کتابخانه Pygame فرادرس
- فیلم آموزش طراحی سایت و وب اپلیکیشن با فریمورک Django فرادرس
در صورت تمایل به دیدن فیلمهای بیشتر با کلیک بر روی تصویر بالا به صفحه اصلی این مجموعه آموزشی رفته و گزینههای متنوع موجود را مشاهده کنید.
متدهای رشته در پایتون با خروجی رشته
در این بخش نمونهای از متدهای بایتی در پایتون را میبینیم که در خروجی رشته برمی گردانند.
متد bytes.decode
صورت پایه این متد در حالت کلی به شکل bytes.decode(encoding=’utf-8′, errors=’strict’) است. متد bytes.decode() توالی از بایتها را با استفاده از روشهای خاص کدگذاری، دیکود میکند و به صورت رشته به خروجی برمیگرداند.
کدگذاری به صورت پیشفرض از قاعده UFT-8 استفاده میکند. در صورت روی دادن خطا، پیغام مربوط به استثنای UnicodeDecodeError بر روی کنسول ظاهر میشود. strict ، ignore و replace آرگومانهای کلیدی هستند که روش مدیریت خطاهای استثنا را اعلام میکنند.
1>>> b'i Enjoy traveling. Do you, \xe5\xb1\xb1\xe6\x9c\xac\xe3\x81\x95\xe3\x82\x93?'.decode()
2'i Enjoy traveling. Do you, 山本さん?'
3>>> b'i Enjoy traveling. Do you, \xe5\xb1\xb1\xe6\x9c\xac\xe3\x81\x95\xe3\x82\x93?'.decode(encoding='ascii')
4Traceback (most recent call last):
5 File "<stdin>", line 1, in <module>
6UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 27: ordinal not in range(128)
7>>>
جدول نمایش متدهای رشته در پایتون
در جدول زیر، تقریبا همه متدهای رشته در پایتون را معرفی کردهایم. در ادامه، بعد از جدول، مهمترین متدها را به صورت جداگانه همراه با مثال بررسی میکنیم. ترتیب قرارگیری این متدها در جدول، بر اساس حروف الفبای نام آنها است. اما ترتیب بررسی متدها بر اساس دستهبندی است که مشخص کردهایم.
جدول ترجمه: به دیکشنری میگویند که از کلید و مقدارهای خاصی تشکیل شده است. معمولا کلید رشته مورد نظر و مقدار، معادل رشته است. از این جدولهای ترجمه برای چند زبانه کردن سایتها یا رمزنگاری متون و غیره استفاده میشود.
جمع بندی
متدهای رشته در پایتون، به متدها و توابعی میگویند که برای کار با نوع داده String ساخته شدهاند. رشتهها قسمت جداییناپذیری از برنامهنویسی هستند. تقریبا در هر کدی که مینویسیم از رشتهها استفاده میکنیم. مخصوصا در پروژههای حرفهای مانند تحلیل داده و دیتا ساینس و غیره. این حوزهها جزو تخصصهای پایتون هستند، به همین دلیل است که در پایتون هم کار با رشتهها از اهمیت خاصی برخوردار شده است. وقتی که کاراکترها در کنار یکدیگر قرار میگیرند، میتوانند کلمات، جملات و حتی متنهای بزرگی را نیز ایجاد کنند. برای مدیریت همه عملیات مختلفی که بر روی رشتهها قابل اجرا است به متدهای رشته در پایتون نیاز داریم.
در این مطلب از مجله فرادرس، در ابتدا کمی با رشته و متدهای آن به طور کلی آشنا شدیم. در یک جدول بزرگ همه این متدها را معرفی کرده و سپس مهمترین آنها را به صورت مجزا تکبهتک توضیح دادیم. همچنین، در توضیح هر متد از نمایش مثالهای کدنویسی شده مرتبط با آن نیز استفاده کردیم.