تجزیه تحلیل (پارس کردن) رشتهها
احتمالاً برای شما هم زیاد پیش میآید که به داخل یک رشته نگاه کرده و به دنبال یک زیر-رشته بگردید. مثلا فرض کنید که یک سری خط که به صورت زیر قالببندی شدهاند را داریم:
1 |
From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008 |
حالا شاید بخواهیم که قسمت دوم آدرس را از هر خط جدا کرده و برداریم (در اینجا: uct.ac.za). ما میتوانیم از متد find و روش قاچ زدن در پایتون، استفاده کنیم.
1 2 3 4 5 6 7 8 9 10 11 |
>>> data = 'From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008' >>> atpos = data.find('@') >>> print(atpos) 21 >>> sppos = data.find(' ',atpos) >>> print(sppos) 31 >>> host = data[atpos+1:sppos] >>> print(host) uct.ac.za >>> |
ما از یک نسخه از متد find که به ما اجازه مشخص کردن جایگاه کاراکتری را در رشته میدهد، استفاده کردیم؛ به این صورت find میداند که جستجو را از کجا شروع کند. زمانی که شروع به قاچزدن کردیم، ما از کاراکتری که یکی از @ جلوتر بود شروع کردیم. شاخص دوم که نشانگر پایانِ قاچزدن است، کاراکتر فاصله بود که در مثال بالا با نام متغیر sppos مشخص است. حالا ما قاچزدن را از کاراکتر بعد از @ و تا کاراکتر فاصله (ولی نه شامل آن) انجام دادیم.
سند مرتبط به متد find را میتوانید در این لینک زیر بخوانید.
عملگر format / قالب / آرایش
عملگر فرمت یا آرایش یعنی % به ما اجازهی ساخت رشتهها و جابجا کردن بخشی از آنها را با دادههایی که در متغیرها ذخیره شده است، میدهد. زمانی که % بر روی اعداد صحیح به کار گرفته میشود، عملگر پیمانه خوانده شده و کارکرد متفاوتی دارد. زمانی که اولین عملوند یک رشته باشد، % عملگر آرایش خواهد بود.
اولین عملوند فرمتاسترینگ1 یا رشته چینش2 خوانده میشود و شامل تعداد یک یا بیشتر از فرمتسکوئنس3 یا «توالی چینش [حروف]» میشود. فرمتسکوئنس مشخص میکند که عملوند نظیر به نظیر چگونه قالببندی یا آرایش شود. نتیجهی حاصله یک رشته خواهد بود.
به عنوان مثال، فرمتسکوئنس “%d” به این معنیست که دومین عملوند بایستی که به عنوان یک عدد صحیح قالببندی شود (در اینجا d اولین حرف decimal است).
1 2 3 |
>>> camels = 42 >>> '%d' % camels '42' |
نتیجهْ رشتهای با مقدار ”42″ است. مراقب باشید که این ”42″ با عدد 42 متفاوت است چرا که اولی یک رشته است و دومی یک عدد صحیح.
یک فرمتسکوئنس، در هر جایی از یک رشته میتواند قرار بگیرد، در نتیجه میتوانید مقداری را در درون یک جمله فرو کنید. به مثال زیر دقت کنید:
1 2 3 |
>>> camels = 42 >>> 'I have spotted %d camels.' % camels 'I have spotted 42 camels.' |
اگر بیش از یک فرمتسکوئنس در یک رشته وجود داشته باشد، دومین آرگیومنت بایستی یک تاپِل4 باشد. هر فرمتسکوئنس با عنصر موجود در تاپل به ترتیب تطبیق داده میشود.
مثال زیر از “%d” برای جایگذاری یک عدد صحیح و “%g” برای جایگذاری یک عدد اعشاری (نپرسید چرا) و “%s” برای جایگذاری یک رشته استفاده کرده است.
1 2 |
>>> 'In %d years I have spotted %g %s.' % (3, 0.1, 'camels') 'In 3 years I have spotted 0.1 camels.' |
شمارهی عناصر در تاپل بایستی با شماره فرمتسکوئنس در رشته تطابق داشته باشد. مثلاً سومین فرمتسکوئنس با سومین عنصر موجود در تاپل پیوند میخورد. همچنین نوع عناصر بایستی که با فرمتسکوئنس مطابق باشد:
1 2 3 4 |
>>> '%d %d %d' % (1, 2) TypeError: not enough arguments for format string >>> '%d' % 'dollars' TypeError: %d format: a number is required, not str |
در مثال اول، عناصر کافی برای عبارت وجود ندارد و در مثال دوم عملوند دوم با نوع اشتباهی نظیر به نظیر شده است.
عملگر قالب، عملگر قدرتمندیست با این توضیح که استفاده از آن سخت است. اطلاعات بیشتر را میتوانید از پیوند زیر بخوانید:
اشکالزدایی
مهارتی که لازم است در حین یادگیری برنامهنویسی بیاموزید، پرسش دائمی این سؤال از خود است: «چه مشکلی اینجا میتونه پیش بیاد؟» یا «چه کار یا کارهایی، کاربر نهایی میتونه انجام بده که برنامهی “بینقص” ما کرش کنه؟»
برای نمونه، به برنامهای که ما برای نشان دادن حلقهی while در فصل «تکرار» استفاده کردیم دقت کنید:
1 2 3 4 5 6 7 8 9 10 |
while True: line = input('> ') if line[0] == '#': continue if line == 'done': break print(line) print('Done!') # Code: http://www.py4e.com/code3/copytildone2.py |
اگر کاربر هیچ ورودی وارد نکند و Enter را بزند چه اتفاقی میافتد:
1 2 3 4 5 6 7 8 9 10 |
> hello there hello there > # don't print this > print this! print this! > Traceback (most recent call last): File "copytildone.py", line 3, in if line[0] == '#': IndexError: string index out of range |
کد به خوبی کار میکند، مگر اینکه با یک خط خالی مواجه شود. در این صورت به این خاطر که کاراکتر صفرمی وجود ندارد، ما یک تریسبک دریافت میکنید.
دو راهحل برای حل این مشکل و امن کردن خط سوم – حتی اگر ورودی خالی باشد – وجود دارد.
اولین راه استفاده از متد startswith است که مقدار False را برای رشتهی خالی برمیگرداند:
1 |
if line.startswith('#'): |
دومین راهحل نوشتن یک گزارهی if با استفاده از الگوی محافظ است. به این صورت که مطمئن شویم دومین عبارت منطقی تنها زمانی که حداقل یک کاراکتر در رشته وجود دارد بررسی میشود.
1 |
if len(line) > 0 and line[0] == '#': |
واژگان فصل
شمارنده / Counter:
متغیری که برای شمارش چیزی به کار میرود و معمولا در ابتدا با صفر مقداردهی میشود و سپس افزایش پیدا میکند.
رشته خالی / Empty String:
رشتهای که کاراکتری نداشته و طول آن 0 است و توسط دو علامت نقلقول مشخص میشود.
عملگر قالب یا آرایش / Format Operator:
یک عملگر، %، که یک «چینش رشته/فرمتاسترینگ» و یک تاپل را گرفته و سپس یک رشته که شامل عناصر آن تاپل میشود را میسازد؛ به صورتی که فرمتاسترینگ تعیینکنندهی ترتیب قرار گیری تاپل در داخل رشته میشود.
توالی چینش حروف / Format Sequence:
توالیای از کاراکترها در یک فرمتاسترینگ، مثل %d، که نشان میدهد یک مقدار چطور بایستی شکل بگیرد.
رشته چینش / Format String:
رشتهای که در کنار عملگر قالب مورد استفاده قرار میگیرد و شامل توالی حروف میشود.
پرچم / Flag:
یک متغیر بولی که برای نشان دادن درست یا غلط بودن یک شرط مورد استفاده قرار میگیرد.
احضار / Invocation:
یک گزاره که متدی را فراخوانی میکند.
غیرقابل تغییر / Immutable:
زنجیرهای که آیتمهای آن قابل گمارش نیستند. به عبارتی شما نمیتوانید آیتمهای موجود در آن را تغییر دهید و مقدار جدیدی را به آنها اختصاص دهید.
شاخص / Index:
یک مقدار صحیح برای انتخاب آیتمی در یک زنجیره، مانند یک کاراکتر در یک رشته.
آیتم / Item:
یکی از مقادیر موجود در یک توالی.
متد / Method:
یک تابع که با یک آبجکت در ارتباط است و توسط نشانهگذاری نقطهای یا نماد نقطه فراخواهی میشود.
آبجکت / Object:
چیزی که یک متغیر میتواند به آن ارجاع پیدا کند. فعلا میتوانید از آبجکت و متغیر به جای هم استفاده کنید چون تا اینجا تقریبا معنای مشابهی دارند.
جستجو / Search:
الگویی از پیمایش برای یافتن چیزی است که بعد از یافتن آن متوقف میشود.
توالی یا زنجیره / Sequence:
یک مجموعهی مرتب شده از یک دسته از مقدارهاست که هر مقدار توسط یک شاخص صحیح شناسایی میشود.
قاچ یا قطعه / Slice:
قسمتی از یک رشته که توسط بازهای از شاخصها مشخص شده است.
پیمایش / Traverse:
گردش کردن در بین آیتمهای یک توالی، و انجام عملیات مشابه بر روی هر کدام از آنها.
تمرینها
تمرین ۵: کدِ پایتون زیر را بردارید:
1 |
str = 'X-DSPAM-Confidence:0.8475' |
با استفاده از find و قابلیت قاچکردن رشته، قسمتی از رشته که بعد از دو نقطه آمده را جدا کرده و سپس با استفاده از تابع float آن قسمت جداشده را به یک عدد اعشاری تبدیل کنید.
تمرین ۶: اسناد متدهای رشته را از این لینک بخوانید.
برای اینکه بفهمید بعضی از آنها چطور کار میکنند بهتر است که در عمل از این متدها استفاده کنید. متدهای strip و replace از جمله بهدردبخورها به حساب میآیند.
سند، از چینشِ متن خاصی – که ممکن است شما را گیج کند – استفاده میکند. برای مثال در find(sub[, start[, end]]) قلابها نشاندهندهی آرگیومنتهای اختیاریاند. در نتیجه sub اجباریست ولی start که در قلاب قرار دارد اختیاریست. همچنین اگر start را مشخص کنید، end نیز میتواند به صورت اختیاری مورد استفاده قرار بگیرد.
این نوشته تحت مجوز کرییتیو کامنز BY – NC و حمایت موسسه تحقیقاتی رامونا ارائه میشود. شما میتوانید با توجه به مفاد این گواهی از آن استفاده کنید.