فهرست مطالب
یک فایل چندصدخطی وسط کارت است و باید از لابهلایش همهی شمارهموبایلها را بیرون بکشی. رجکس دقیقاً برای همین لحظه ساخته شده. رجکس چیست؟ یعنی شکلِ چیزی را که میخواهی با چند علامت کوچک توصیف کنی؛ بعد موتور جستوجو هر تکهای از متن را که با آن توصیف میخواند پیدا میکند.
سه جا بیشترین استفاده را دارد. در جستوجو، وقتی تکههای همشکل را از لابهلای متن درمیآوری. در بررسی فرم، وقتی میخواهی مطمئن شوی ورودی کاربر شبیه شماره موبایل است یا نه. و در جایگزینی، وقتی دهها تکه را یکجا عوض میکنی. پایتونش ماژول re است و جاوااسکریپت RegExp دارد؛ ایدهی اصلی در همهی زبانها یکی است و همینجا همان را یاد میگیری.
چطور با رجکس شماره موبایلها را از متن بیرون بکشم؟
با یک مثال واقعی شروع کن؛ این کد را همانطور که هست میتوانی اجرا کنی:
pythonimport re
matn = "شب 09121234567 تماس گرفت و پیام داد؛ شمارهی دفترش 02188776655 است."
print(re.findall(r"09\d{9}", matn))
خروجی:
['09121234567']
الگو تکهتکه خوانده میشود. دو کاراکتر اول عدد ۰ و ۹ هستند، بعد \d میگوید هر رقمی، بعد {9} میگوید همین گرفتن رقم دقیقاً نُه بار تکرار شود. شمارهی دفتر با ۰۲ شروع میشود و از همان دو رقم اول با الگو جور درنمیآید. هر رجکسی را با همین تقسیمبندی بخوان؛ اگر یکجا نگاهش کنی فقط رشتهای از علامتهای غریبه میبینی.
اجزای regex کداماند و هر کدام چه میگویند؟
این هفت علامت را بشناسی، بیشتر الگوهای رایج را میخوانی:
| علامت | یعنی | اجرا که بکنی |
|---|---|---|
\d |
هر رقمی، حتی ارقام فارسی | روی «سال ۱۴۰۵» برمیگرداند ۱۴۰۵ |
+ |
یک بار یا بیشتر | \d+ رشتهی رقمهای پشتسرهم را کامل میگیرد |
{9} |
دقیقاً نُه بار | 09\d{9} همان الگوی شمارهی بالا |
? |
صفر یا یک بار | colou?r هم color را میگیرد هم colour |
[abc] |
یکی از همین حروف | [A-Za-z0-9._%+-] بخش اول الگوی ایمیل است |
. |
هر کاراکتری بهجز خط جدید | a.c هم abc را میگیرد هم a c |
^ و $ |
قفل به شروع و پایان | ^\d{4} فقط وقتی متن با چهار رقم شروع شود |
چهوقت سراغ regex نرویم؟
رجکس شکل را میبیند، ساختار را نه. این تفاوت وقتی گران میشود که متن ساختار داشته باشد؛ مثلاً HTML:
pythonimport re
html = "<p>پاراگراف اول</p><p>پاراگراف دوم</p>"
print(re.findall(r"<p>(.*)</p>", html))
خروجی:
['پاراگراف اول</p><p>پاراگراف دوم']
ستارهی .* حریص است و تا آخرین بستهشدن تگ پیش میرود؛ دو پاراگراف در یک تطبیق بلعیده شدند. با .*? دو تکهی تمیز برمیگردند، ولی این هنوز وصله است. برای HTML و JSON ابزار خودشان را بردار؛ الگو ساختار تودرتو را نمیفهمد.
ایمیل هم داستان خودش را دارد. در چرا اعتبارسنجی ایمیل با Regex هیچوقت کامل نیست با تست واقعی نشان دادهایم که هر الگوی ایمیل یا کاربر واقعی را رد میکند یا ورودی خراب را قبول.
الگوی regex را کجا سریع تست کنم؟
در تست رجکس آنلاین الگو مینویسی، متن میگذاری و تطبیقها همان لحظه هایلایت میشوند. فلگ g همهی تطبیقها را میگیرد و فلگ i بزرگ و کوچکی حروف را بیاثر میکند. همهچیز داخل مرورگر اجرا میشود و هیچ ورودیای جایی ذخیره نمیشود.
یک نکتهی کوچک هم بگویم که دیر یا زود گریبانت را میگیرد. \d در پایتون حتی ارقام فارسی مثل ۱۴۰۵ را هم میگیرد؛ خودم روی Python 3.13 آزمایشش کردم. جاوااسکریپت اما همان \d را فقط ارقام ۰ تا ۹ انگلیسی میشناسد. پس الگویی که برای فرم وب نوشته شده ممکن است در پایتون رفتار دیگری داشته باشد؛ هر الگو را با متن واقعی خودت بسنج، نه با نمونهی کپیشده.
وقتی این اجزا برایت جا افتاد، دورهی آموزش Regex از صفر همانها را درسبهدرس با تمرین تعاملی جلو میبرد؛ بیست درس است و کامل رایگان.
قدم بعدی روشن است. یک متن واقعی از کارت بردار و الگوی \d+ را رویش اجرا کن. از این به بعد هر الگویی که لازم شد را کپی نمیکنی؛ خودت مینویسی و در تستر میسنجی.





نظرها
اولین نفری باشید که نظر میدهدسؤالتان را بپرسید یا تجربهتان را بنویسید تا نویسندهی مطلب پاسخ بدهد.