آشنایی با موتور RegEx و رفتار توابع جستجو
درک تفاوتهای حیاتی میان match، search، findall و پردازش رشتههای خام
عبارات باقاعده (Regular Expressions یا به اختصار RegEx) زبان قدرتمند و بسیار فشردهای است که در دلِ اکثر زبانهای برنامهنویسی برای آنالیز، اعتبارسنجی و استخراج اطلاعات از درون متون (متون حجیم، کدهای HTML یا فایلهای Log) تعبیه شده است. در پایتون، ما به کمک کتابخانه داخلی re با موتور رگکس ارتباط برقرار میکنیم.
یک قانون طلایی در پایتون: همیشه الگوهای رگکس خود را به صورت "رشته خام" (Raw String) بنویسید (با افزودن حرف r پیش از باز کردن کوتیشنها، مثل r"pattern"). در غیر این صورت، پایتون بکاسلشهای موجود در الگوی شما (مثل \n یا \t) را به عنوان دستورات کنترلی خودش ترجمه کرده و باعث انهدام الگوی رگکس میگردد!
چهار متد بنیادین برای جستجو در موتور رگکس پایتون وجود دارد که تفاوت عملکردشان، بیشترین خطای منطقی را برای تازهکاران به همراه دارد:
re.search() | اسکن کردن کل متن؛ به محض پیدا کردن "اولین" تطابق در هر کجای متن که باشد، متوقف شده و یک شیء Match برمیگرداند. |
re.match() | بسیار سختگیر! این تابع الگو را "فقط و فقط از اندیس 0" (ابتدای رشته) بررسی میکند. اگر الگو در وسط متن باشد، آن را نادیده گرفته و None میدهد. |
re.fullmatch() | کاملاً سختگیر! بررسی میکند که آیا "کل رشته از کاراکتر اول تا آخر" دقیقاً با الگو برابری میکند یا خیر (ایدهآلترین ابزار برای اعتبارسنجی ایمیل و پسورد در فرمها). |
re.findall() | برخلاف موارد بالا که شیء میدهند، این تابع کل متن را میگردد و یک "لیست" از تمام تطابقهای یافته شده (به شکل استرینگ مستقیم) برمیگرداند. |
re.finditer() | برادرِ بزرگترِ findall است؛ کل متن را میگردد اما نتیجه را به جای لیستِ یکجا، در قالب یک "ژنراتور از اشیاء Match" استریم میکند. برای فایلهای متنی چند گیگابایتی و یافتن ایندکس شروع/پایان بینظیر است. |