کتابخانه پایتون پارس: روشی ساده برای معکوس کردن F-strings

منتشر‌شده در towardsdatascience به تاریخ ۶ سپتامبر ۲۰۲۱
لینک منبع: Python Parse Library: A Simple Way For Reversing F-strings

درون یابی رشته‌ای فرایند اصلاح رشته‌ها با استفاده از متغیرهایی است. رشته‌های بدست آمده شامل مقادیر متغیرهایی است. در پایتون، روش قالب و رشته‌های f دو روش معمول درون یابی رشته هستند.

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

folder = "notebook"
subfolder = "parse"file_path = f"documents/{folder}/{subfolder}"print(file_path)
documents/notebook/parse

متغیرهایی با مهاربندهای مجعد نشان داده شده‌اند و مقادیر آن‌ها در خروجی گنجانده شده است.

این یک مثال دیگر است.

name = "John"
age = "23"print(f"{name} is {age} years old.")
John is 23 years old.

ما اکنون بیشتر با رشته‌های f و درونیابی رشته‌ای به طور کلی آشنا هستیم. کاری که کتابخانه پارس می‌کند نوعی معکوس کردن فرآیند درون یابی رشته است.

مقادیر قرار داده‌شده در رشته‌ها را می توان با استفاده از کتابخانه parse استخراج کرد. ما چندین مثال برای توضیح واضح این فرآیند انجام خواهیم داد.

کتابخانه parse را می توان به راحتی با pip نصب کرد. اگر از نوت‌بوک jupyter استفاده می‌کنید، فقط "!" را قبل از pip اضافه کنید.

!pip install parse

پارس

در مثال اول، ما یک مسیر فایل با استفاده از نام‌های از پیش تعریف شده پوشه و زیرپوشه ایجاد کردیم. بیایید نام پوشه را از یک مسیر با استفاده از کتابخانه parse بگیریم. ما ابتدا باید تابع پارس را از کتابخانه پارس وارد کنیم.

from parse import parsefile_path = "documents/notebook/pandas"parse("documents/{folder}/{subfolder}", file_path)
<Result () {'folder': 'notebook', 'subfolder': 'pandas'}>

ما مسیر فایل را به همراه رشته‌ای که نشان دهنده متغیرهایی است می‌گذرانیم. تابع پارس یک شی نتیجه را برمی گرداند اما می‌توانیم با اضافه کردن روش نامگذاری شده آن را زیباتر کنیم.

parse("documents/{folder}/{subfolder}", file_path).named
{'folder': 'notebook', 'subfolder': 'pandas'}

در نظر بگیرید که ما لیستی از مسیرها با فرمت مشابه داریم و باید نام پوشه و زیرپوشه را استخراج کنیم. این کار را می توان به راحتی با ترکیب خوبی از تابع تجزیه‌گر (پارسر) و درک لیست انجام داد.

file_paths = [
"documents/notebook/pandas",
"documents/notebook/parse",
"documents/notes/python"
][parse("documents/{folder}/{subfolder}", path).named for path in file_paths][{'folder': 'notebook', 'subfolder': 'pandas'},
{'folder': 'notebook', 'subfolder': 'parse'},
{'folder': 'notes', 'subfolder': 'python'}]

جستجو

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

from parse import searchtxt = "Name: Jane, Department: Engineering, Age: 22"search("Name: {Name},", txt).named
{'Name': 'Jane'}

تابع جستجو همچنین زمانی می‌تواند مورد استفاده قرار گیرد که ما در مورد رشته دقیق مطمئن نیستیم. بنابراین انعطاف‌پذیری بیشتری را فراهم می‌کند.

رشته‌های زیر را در نظر بگیرید:

txt = "The department of civil engineering has 23 employees"
txt2 = "The civil engineering department has 23 employees"

ما باید تعداد کارمندان را در این متن پیدا کنیم. ما می‌توانیم آن را با همان زیرالگو پیدا کنیم.

search("has {number_of_employees} employees", txt).named
{'number_of_employees': '23'}search("has {number_of_employees} employees", txt2).named
{'number_of_employees': '23'}

تابع Findall

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

مثال زیر استفاده ممکن از تابع فایندال را نشان می‌دهد.

from parse import findallpaths = "documents/notebook/pandas documents/notebook/parse documents/notes/python"findall("documents/{folder}/{subfolder}", paths)
<parse.ResultIterator at 0x2056556a430>

ما یک رشته بلند داریم که شامل چندین مسیر فایل با فرمت مشابه است. تابع findall (همه را پیدا کن)، همان طور که از اسمش پیداست، تمام اسامی پوشه و زیرپوشه‌ها را با توجه به ساختار مسیر پیدا می‌کند.

به طور پیش‌فرض، آن یک تکراری ساز را برمی گرداند اما ما به راحتی می‌توانیم آن را به یک لیست تبدیل کنیم.

list(findall("documents/{folder}/{subfolder}", paths))[<Result () {'folder': 'notebook', 'subfolder': 'p'}>,
<Result () {'folder': 'notebook', 'subfolder': 'p'}>,
<Result () {'folder': 'notes', 'subfolder': 'p'}>]

این لیست شامل 3 شی نتیجه است. ما می‌توانیم روش نام گذاری شده را به طور جداگانه برای این اشیا به کار ببریم.

a = list(findall("documents/{folder}/{subfolder}", paths))a[0].named
{'folder': 'notebook', 'subfolder': 'p'}

نتیجه‌گیری

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

راه‌های دیگری نیز برای انجام وظایف مشابه وجود دارد. به عنوان مثال، مثال‌های این مقاله را می توان با regex نیز انجام داد. با این حال، regex ممکن است برای عملیات خاص بسیار پیچیده باشد. احساس می‌کنم کتابخانه پارس راه‌حل‌های بسیار ساده تری ارائه می‌دهد.

متشکرم که مطالعه کردید.

این متن با استفاده از ربات مترجم مقاله علم داده ترجمه شده و به صورت محدود مورد بازبینی انسانی قرار گرفته است.در نتیجه می‌تواند دارای برخی اشکالات ترجمه باشد.
مقالات لینک‌شده در این متن می‌توانند به صورت رایگان با استفاده از مقاله‌خوان ترجمیار به فارسی مطالعه شوند.