۷ ترفند مفید برای یادگیری Python Regex

شکل ۱. یادگیری
شکل ۱. یادگیری


منتشر‌شده در towardsdatascience به تاریخ ۸ مارس ۲۰۲۱
لینک منبع: 7 Useful Tricks for Python Regex to Learn

بیان منظم (معروف به Regex) یکی از مهم‌ترین و رایج‌ترین زبان‌های برنامه‌نویسی است. البته این امر در مورد Python نیز صادق است. پایتون در مقایسه با دیگر زبان‌های برنامه‌نویسی، الگوهای کاربردی منحصر به فردی ازregex دارد. در این مقاله، من ۷ نکته مفید در مورد regex در پایتون برای شما ترتیب داده‌ام. آن‌ها یا ترفندهای کوچکی هستند که می‌توانند بهره‌وری شما را بهبود بخشند، برخی مشکلات پیچیده را حل کنند و یا خوانایی کد شما را بهبود بخشند. امیدوارم کمک کنند!

ممکن است به مطالعه مقاله ساخت سریع برنامه‌های کاربردی وب ML با Streamlit علاقمند باشید.

۱. همیشه از r-string استفاده کنید.

بسیاری از یادگیرندگان می‌دانند که ما باید از «رشته r» زمانی که یک الگویregex را تعریف می‌کنیم، استفاده کنیم. با این حال، متوجه شدم که بسیاری از مردم دلیل آن را نمی‌دانند. برخی از یادگیرندگان به r-string به عنوان رشته regex فکر می‌کنند که کاملا اشتباه است. در عوض باید «رشته خام» باشد.

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

s = 'I\'m Chris'

البته، نه تنها می‌توان از نقل‌قول‌ها فرار کرد، بلکه سناریوهای بسیار دیگری نیز وجود دارند که ما باید از لغزش رو به عقب استفاده کنیم. برای مثال /n در رشته زیر به عنوان “new-line” تفسیر شده است.

print('a\nb')

اگر می‌خواهید /n را به عنوان بخشی از رشته داشته باشید نباید یک new-line باشد،‌ می‌توان r-string را به پایتون معرفی کرد تا آن را تفسیر نکند.

print(r'a\nb')

وقتی که یک الگوی ریژکس می‌نویسیم گاها از اسلش یا کاراکترهای خاص دیگر استفاده می‌کنیم. بنابراین برای جلوگیری از آن، مفسر پایتون رشته را به طرز غلطی تفسیر می‌کند. همیشه توصیه می‌شود که هنگام تعریف یک الگوی regex از «رشتهr» استفاده شود.

فرض کنید به دنبال الگویی هستیم که چندین حرف بعد از چند گام سفید تکرار شوند، می‌توانیم regex را به صورت زیر بنویسیم.

re.search(r'(\w+)\s+\1', 'abc abc')

اگرچه، اگر در اینجا از “r-string” استفاده نکنیم تعیین کننده گروه /1 تشخیص داده نخواد شد.

۲. در صورت لزوم از پرچم re.IGNORECASE استفاده کنید.

«پرچم‌ها» به نوعی در Python Regex منحصر به فرد هستند که همه زبان‌های برنامه‌نویسی دیگر آن را ندارند. به عبارت دیگر، الگوهای regex را ایجاد کنید که – غیر‌حساس موردی هستند.

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

re.search(r'[a-zA-Z]+', 'AbCdEfG')

این قطعا روش استانداردی است، و اگرA-Z را اضافه نکنیم، مطابق انتظار کل رشته نخواهد بود.

با این حال، پایتون به گونه‌ای است که ما می‌توانیم بیشتر بر خود الگو تمرکز کنیم و نیازی نیست نگران موارد حروف باشیم. این کار به معنای استفاده از re.IGNORECASE. است. حتی می‌توان آن را خیلی کوتاه کرد و به شکل re.I که همان کار را انجام می‌دهد عنوان کرد.

re.search(r'[a-z]+', 'AbCdEfG', re.IGNORECASE)
re.search(r'[a-z]+', 'AbCdEfG', re.I)

۳. استفاده مجدد از پرچم re.VERBOSE برای بهبود توانایی ویرایش

یکی از معایب اصلی این نسخه این است که قابلیت خواندن ضعیفی دارد. معمولا، این ترکیبی است که ما باید با آن مواجه شویم. با این حال، آیا می‌دانید که پایتون روش بهتری برای بهبود خوانایی رشته الگوی regex دارد؟ این کار برای استفاده از پرچم re.verB OSE است.

می‌توان الگوی ریجکس بخش 1 را بازنویسی کرد. در اصل رشته الگو باید به شکل r'(\w+)\s+\1' باشد. خب، این خیلی بد نیست، اما فرض کنید اگر ما الگوی بسیار پیچیده‌تری داشته باشیم، احتمالا تنها نویسنده می‌تواند آن را درک کند. این یک مساله بسیار رایج با regex است. با این حال، با پرچم وربوز، ما می‌توانیم آن را به این شکل بنویسیم.

re.search(r'''
(\w+) # Group 1: Match one or more letters, numbers or underscore
\s+ # Match one or more whitespaces
\1 # Match the Group 1 whatever it is
''', 'abc abc', re.VERBOSE)

این دقیقا برابر است با r'(\w+)\s+\1' لطفا توجه داشته باشید که این پرچم re.VERBOSE یک چیز ضروری است اگر بخواهیم آن را به این صورت بنویسیم. البته در غیر این صورت، regex جواب نخواهد داد.

باز هم، پرچم نسخه کوتاهی دارد: re.X.

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

۴. سفارشی‌سازی رفتار re.sub ()

عبارتre.sub () یکی از متداول‌ترین توابع مورد استفاده درPython regex است. این رشته تلاش می‌کند تا یک الگو را در یک رشته پیدا کند و آن را با رشته جایگزین ارائه‌شده (repl) جایگزین کند.

re.sub(pattern, repl, string, count=0, flags=0)

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

re.sub(r'\d', '*', 'User\'s mobile number is 1234567890')


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

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

def hide_reserve_3(s):
return '*' * (len(s[0])-3) + s[0][-3:]

در این تابع، یک شی تطبیق یافتهPython regex (s) به عنوان تنها آرگومان در نظر گرفته می‌شود. اگر چند تطبیق وجود داشته باشد، شی s دارای چند رشته خواهد بود، بنابراین باید آن را حلقه کنیم. اما بیایید در این مثال فقط برای اهداف نمایشی ساده باشیم. s [ ۰ ] اولین شماره‌تلفن تطبیق داده‌شده خواهد بود.

بعد، چیزی که به ما برگشت داده می‌شود این است که ستاره‌ها چندین بار تکرار شدند. یعنی اگر طول رشته ۱۰ باشد آنگاه ۱۰-۳ = ۷ ستاره بازخواهند گشت. سپس سه رقم پس‌مانده به صورت-is نگهداری خواهند شد، بنابراین آشکار خواهد شد.

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

re.sub(r'\d+', lambda s: '*' * (len(s[0])-3) + s[0][-3:], 'User\'s mobile number is 1234567890')

۵. برای به کار انداختن قابلیت استفاده مجدد از فایلre.comp () استفاده کنید.

گاهی اوقات ممکن است بخواهیم چندین بار از یک الگو استفاده کنیم. به احتمال زیاد یک متغیر رشته-r که می‌تواند دوباره مورد استفاده قرار گیرد، کافی است. با این حال، اگر بخواهیم از این الگو برای اهداف مختلف استفاده کنیم، و همچنین می‌خواهیم خوانایی را بهبود بخشیم، استفاده از re.comp ile () ممکن است انتخاب بهتری باشد.

pattern = re.compile('abc')

پس از تعریف قالب با re.comp ile () ، می‌توانیم از آن در هر زمان مورد نیاز استفاده کنیم.

۶. از Regex برای ایجاد فرهنگ لغت استفاده کنید.

گاهی اوقات ما می‌خواهیم ازregex برای استخراج اطلاعات از رشته‌هایی که همان الگو را دنبال می‌کنند، استفاده کنیم. سپس، قرار دادن آن‌ها در یک فرهنگ لغت ایده بسیار خوبی است. برای مثال، رشته "My name is Christopher Tao and I like Python." شامل اسم کوچک شخص، نام‌خانوادگی و اینکه چه زبانی ترجیح داده می‌شود. اگر ما مقدار زیادی از این رشته را داشته باشیم و بخواهیم اطلاعات را در یک فرهنگ لغت استخراج کنیم، در واقع می‌توانیم این کار را بدون هیچ‌گونه سربار انجام دهیم. Python regex می‌تواند آن را خارج از جعبه به دست آورد.

re.match(
r"My name is (?P<first_name>\w+) (?P<last_name>\w+) and I like (?P<preference>\w+).",
"My name is Christopher Tao and I like Python."
).groupdict()

در الگوی regex، می‌توانیم «کلید» رشته منطبق شده را تعریف کنیم، و سپس آن‌ها به طور خودکار در یک فرهنگ لغت ترسیم خواهند شد. ما باید الگو را دنبال کنیم. (جایی که Y نام کلیدی است، الگوی regex تعریف شده‌است.)

۷. استفاده از گروه‌های Regex برای دستیابی به الگوهای تکرار

همه ما می‌دانیم که regex می‌تواند الگوها را بگیرد. با این حال، گاهی اوقات ما می‌خواهیم این الگوها را به روش «پیشرفته»‌تری بگیریم. به عنوان مثال، ما نمی‌دانیم که دقیقا چه رشته‌ای با یک الگو مطابقت خواهد داشت، اما اگر چندین بار تکرار شود، می‌خواهیم کل آن را بگیریم.

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

pair = re.compile(r'''

    .*    # Match any number of any charaters

    (.)   # Match 1 character, whatever it is (except new-line), this will be the &quotgroup 1&quot

    .*    # Match any number of any charaters

    \1    # Match the group 1

''', re.VERBOSE)pair.match('abcdefgc').groups()[0]

ما ابتدا باید الگو را تعریف کنیم. در اینجا، من از علامت re.verB OSE استفاده کردم، بنابراین بیشتر قابل خواندن و قابل‌فهم خواهد بود. در الگو، از پرانتز برای تعریف گروه استفاده کرده و سپس این گروه /1 را برای گرفتن رشته تکراری استفاده می‌کنیم.

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

خلاصه

در این مقاله، من ۷ نکته را سازمان‌دهی کرده‌ام که به نظر من برای برخی از فراگیران مفید خواهد بود، و همچنین برای تکمیل دانش خود اگر هرگز ازregex به چنین روش‌هایی استفاده نکنید. بیایید با هم Python Regex را با خوانایی بهتر و راحتی بیشتر بنویسیم. زندگی کوتاه است، از پایتون استفاده کنید!

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