ساخت Regex با هوش مصنوعی؛ مثال و تست فارسی

ساخت Regex با هوش مصنوعی را با مثال فارسی و کد Python یاد بگیرید؛ تعیین موتور، نمونه مثبت و منفی، حفظ قرارداد ارقام و تست الگو پیش از استفاده.

تتیم GPT Plus۵ دقیقه مطالعه
دروازه‌ای مفهومی که الگوهای مشابه را از نشانه‌های نامطابق جدا می‌کند

ساخت Regex با هوش مصنوعی را با تعیین موتور و نمونه‌های معتبر و نامعتبر شروع کنید. مدل باید یک الگوی محدود، توضیح اجزای آن و آزمون‌های قابل اجرا بدهد؛ شباهت ظاهری عبارت به یک راه‌حل حرفه‌ای کافی نیست. در این راهنما یک کد سفارش فرضی را با Python بررسی می‌کنیم و تفاوت استخراج متن با اعتبارسنجی کامل را می‌بینیم.

Regex برای چه مسئله‌ای مناسب است؟#

عبارت منظم برای شکل مشخص متن مفید است: کد سفارش، ساختار ساده شناسه یا یافتن یک نشانه در لاگ. برای فهم معنای جمله، اعتبار واقعی تاریخ یا تشخیص هویت مشتری به ابزار و منطق بیشتری نیاز دارید. «هر متنی که شبیه ایمیل است» با «نشانی ایمیل قابل استفاده» یک مسئله نیست.

پیش از پرامپت، قرارداد را بنویسید. در مثال ما کد باید با ORD- شروع شود، سال آن یکی از ۱۴۰۴ یا ۱۴۰۵ با ارقام لاتین باشد و بخش آخر دقیقاً چهار رقم داشته باشد. فاصله، متن اضافه و ارقام فارسی در این قرارداد پذیرفته نیستند. این محدودیت برای آموزش انتخاب شده و استاندارد عمومی کد سفارش نیست.

نمونهانتظاردلیل
ORD-1405-0001قبولمطابق قرارداد
ORD-1404-9999قبولسال مجاز و چهار رقم
ORD-1403-0001ردسال خارج از فهرست
ORD-1405-001ردطول بخش آخر کمتر است
ORD-۱۴۰۵-۰۰۰۱ردقرارداد ارقام لاتین دارد
xORD-1405-0001ردپیشوند اضافه دارد
ORD-1405-0001xردپسوند اضافه دارد

پرامپت آماده برای تولید الگو#

برای موتور re در Python، اعتبارسنجی کامل کد سفارش می‌خواهم. پیشوند دقیق ORD-، سال فقط 1404 یا 1405، جداکننده خط تیره و شماره چهاررقمی لاتین است. فضای خالی و متن اضافی نباید پذیرفته شود. بر اساس جدول نمونه، الگوی کوتاه بساز، هر جزء را توضیح بده و با fullmatch آزمون اجراشدنی بنویس. اگر نیاز به نرمال‌سازی وجود دارد آن را جداگانه پیشنهاد کن؛ در خود الگو قرارداد را گسترش نده.

برای این مسئله، الگوی ORD-(?:1404|1405)-[0-9]{4} کافی است. گروه سال فقط انتخاب مجاز می‌سازد و بخش آخر تعداد رقم را محدود می‌کند. استفاده از [0-9] به جای \d در این قرارداد عمدی است. رفتار الگوهای Unicode و fullmatch در مستندات رسمی re پایتون توضیح داده شده است.

import re

pattern = re.compile(r"ORD-(?:1404|1405)-[0-9]{4}")
cases = [
    ("ORD-1405-0001", True),
    ("ORD-1404-9999", True),
    ("ORD-1403-0001", False),
    ("ORD-1405-001", False),
    ("ORD-۱۴۰۵-۰۰۰۱", False),
    ("xORD-1405-0001", False),
    ("ORD-1405-0001x", False),
    ("ORD-1405-0001\n", False),
]
for value, expected in cases:
    actual = pattern.fullmatch(value) is not None
    assert actual == expected, (value, actual, expected)

استخراج از متن با اعتبارسنجی فرق دارد#

اگر عبارت «سفارش ORD-1405-0001 ثبت شد» را بررسی کنید، fullmatch رد می‌کند چون کل رشته کد سفارش نیست. برای یافتن یک کد داخل جمله، جست‌وجو لازم است. ولی جست‌وجوی همان الگوی ساده داخل ORD-1405-00012 ممکن است بخش کوتاه‌تر را پیدا کند. مرزهای مجاز را هم باید تعریف کنید.

یک پرامپت تکمیلی بنویسید: «کد داخل جمله را می‌خواهم؛ اگر بلافاصله قبل یا بعد آن حرف، رقم یا خط تیره باشد، آن را معتبر ندان. نمونه‌های منفی زیر را اضافه کن.» سپس موتور را مشخص کنید؛ امکانات نگاه به عقب و شیوه مرزبندی در همه محیط‌ها یکسان نیست. عبارت تولیدشده برای Python را بدون آزمون به JavaScript یا جست‌وجوی یک ویرایشگر منتقل نکنید.

ارقام فارسی، فاصله و نیم‌فاصله را چه کنیم؟#

دو تصمیم جدا دارید: آیا ورودی را نرمال می‌کنید، و آیا شکل خام باید حفظ شود؟ اگر قرار است کاربر عدد فارسی وارد کند، تبدیل رقم پیش از اعتبارسنجی می‌تواند مناسب باشد. در این صورت مقدار خام را برای نمایش و گزارش نگه دارید و خروجی استاندارد را در ستون جدا ذخیره کنید.

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

چگونه مجموعه آزمون خوبی بسازیم؟#

آزمون مثبت فقط نشان می‌دهد الگو بعضی متن‌ها را می‌پذیرد. آزمون منفی نشان می‌دهد چه متن‌هایی را اشتباه قبول نمی‌کند. برای هر شرط، یک نمونه دقیقاً روی مرز و یک نمونه بیرون مرز بنویسید. طول سه و پنج رقم، سال نامجاز، حروف کوچک، فاصله انتهایی، رشته خالی و خط جدید از موارد مهم همین مثال‌اند.

از AI بخواهید «نمونه‌ای پیدا کن که الگو قبول کند اما قرارداد رد کند». این پرسش برای نقد مفید است، اما پاسخ مدل جای اجرای آزمون را نمی‌گیرد. هر مورد تازه را به مجموعه ثابت اضافه کنید تا اصلاح بعدی، یک رفتار قبلی را خراب نکند. نام هر آزمون باید مشخص کند کدام تصمیم را کنترل می‌کند.

الگوهای پیچیده را کوچک نگه دارید#

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

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

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

سوالات متداول

چرا موتور Regex باید مشخص باشد؟

نگارش و امکانات میان Python، JavaScript و ابزارهای دیگر متفاوت است. الگوی یک محیط را بدون آزمون به محیط دیگر منتقل نکنید.

تفاوت search و fullmatch چیست؟

search دنبال بخش مطابق در متن می‌گردد. fullmatch بررسی می‌کند تمام رشته با الگو سازگار باشد.

آیا Regex تاریخ واقعی را تأیید می‌کند؟

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

اشتراک‌گذاری:تلگرامواتساپX
ت
تیم GPT Plus

ما در GPT Plus هر روز با مدل‌های هوش مصنوعی کار می‌کنیم و تجربه‌هایمان را به فارسی می‌نویسیم تا استفاده از AI برای همه ساده‌تر شود.

آماده‌ای امتحانش کنی؟

همین حالا رایگان با GPT Plus شروع کن.

شروع رایگان