Regular Expressions

دوباره به سراغ کتابخانه های استاندارد می رویم. Regular expressions یا regexes یک زبان برنامه نویسی domain-specific است. این زبان یک ساختار گرامری دقیق و سریع را برای مقایسه ی ورودی های string ارائه می دهد. این زبان در سال 1951 توسط Stephen Cole Kleene معرفی شد و تبدیل به ابزار بسیار معروفی برای validation، search و manipulation متن شد.

مثلا فرض کنید به دنبال دریافت لینک های یک متن هستید. میدانیم که لینک های صفحه با https یا http شروع می شوند. برای جست و جو و دریافت این لینک ها از کل یک متن به شکل زیر باید کد را بنویسیم:

import re
text = "..."
pattern = 'https?://\S+'
print(re.search(pattern, text))

این ساختار در زمانی که لینکی با شروع https یا http پیدا کرد آن را جدا کرده و تا رسیدن به space ، newline یا end of the text محتوای لینک را باز میگرداند. جزییات زیادی در regex ها وجود دارد و یادگیری کامل آنها بسیار طاقت فرساست. در ادامه تنها موارد مهم را باهم بررسی میکنیم:



تجربه:

به شخصه تنها یک بار از regex استفاده کردم و در آن مورد هم نیاز به تحلیل و باز کردن داده های خام یک سنسور lidar داشتم. تجربه ی کلی استفاده از regex را خوشایند نمیدانم و معمولا از روش های دیگر عملیات پردازش متنی خود را انجام میدهم. استفاده کردن یا نکردن از regex کاملا به تصمیم شخصی شما بستگی دارد ولی پیشنهاد من در آشنایی اولیه و سپس تنها در صورت نیاز استفاده کردن از آن است.



  • بیشتر کاراکترها در regex به معنی خود واقعیشان هستند. در مثال بالا h دقیقا به معنی پیدا کردن حرف h در متن است.
  • استفاده از [ ] به معنای این است که چند حالت وجود دارد مثلا اگر بخواهیم H یا h را پیدا کنیم باید به این شکل بنویسیم: [Hh]
  • بحث بعدی تحلیل non-whitespace character هاست. برای این کار میتوانیم از character class ها استفاده کنیم: S\ به معنای تمام کاراکترهای ممکن است. w\ برای word character هاست. W\ برای non-word character هاست و d\ برای اعداد.
  • عملگر ? به معنای اختیاری بودن یک المان است. در کد بالا وجود کاراکتر s در انتهای https اجباری نیست در واقع عملگر ? به معنای رخداد 0 یا 1 بار المان است . عملگر مهم دیگر + است. این عملگربه معنای رخداد 1 یا بیشتر از 1 یک المان است(در کد بالا رخداد بیشتر از یک کاراکتر S\).
  • پرانتز ها () نمایانگر capture group ها هستند. خروجی آنها از 1 شماره گذاری میشود و به صورت ترتیب وجود داشتن در متن مشخص می شوند.
  • بک اسلش ها نیز \ به همراه یک عدد تعریف می شوند و رخداد مشخصی را باز میگردانند. مثلا 1\ به معنای اولین رخداد یک regex مشخص است. در regex پایتونی از این کاراکتر باید 2 بار استفاده کرد: 1\\