## মেটা ক্যারেক্টার আমরা এর আগে জেনেছি যে রেগুলার এক্সপ্রেশন হচ্ছে এক ধরণের ডোমেইন স্পেসিফিক ল্যাঙ্গুয়েজ। উদাহরণ হিসেবে জেনেছি SQL এর কথা। তাই স্বাভাবিক ভাবেই এর মাধ্যমে জটিল কিছু লজিক বা প্যাটার্ন লিখতে হতেই পারে। আর তাই, রেগুলার এক্সপ্রেশন লেখার সময় কিছু মেটা ক্যারেক্টার এর ব্যবহার করতে হয়। এগুলোর ব্যবহারের মাধ্যমে বস্তুত রেগুলার এক্সপ্রেশনকে আরও ডাইনামিক ভাবে ব্যবহার করা যায়। নিচের কিছু উদাহরণ দেখলেই বিষয়টি পরিষ্কার হয়ে যাবে। **. (dot)** এই মেটা ক্যারেক্টারের মাধ্যমে যেকোনো ক্যারেক্টার ম্যাচ করার নির্দেশ দেয়া হয় (শুধু নিউ লাইন ক্যারেক্টার বাদে)। উদাহরণ, ```python import re pattern = r"gr.y" if re.match(pattern, "grey"): print("Match 1") if re.match(pattern, "gray"): print("Match 2") if re.match(pattern, "blue"): print("Match 3") ``` আউটপুট, ```python Match 1 Match 2 ``` উপরে আমরা একটি রেগুলার এক্সপ্রেশন ডিফাইন করেছি `r"gr.y"` এর মাধ্যমে। এখানে `.` দিয়ে ওই অবস্থানে যেকোনো ক্যারেক্টার এর সাথে ম্যাচ দেখতে বলা হয়েছে। আর তাই যখন `grey` বা `gray` এর সাথে ম্যাচ করা হয়েছে তখন রেজাল্ট সত্য এসেছে এবং একটি প্রিন্ট স্টেটমেন্ট এক্সিকিউট হয়েছে। `blue` এর ক্ষেত্রে তা হয় নি। > > ইতোমধ্যে হয়তো খেয়াল করেছেন এক্সপ্রেশন এর শুরুতে `r` এর ব্যবহার। এর মাধ্যমে একটি স্ট্রিং কে Raw বা শুধুই সাধারণ স্ট্রিং হিসেবে ডিফাইন করা হয়। এতে করে রেগুলার এক্সপ্রেশন এর মধ্যে থাকা "মেটা ক্যারেক্টার" এবং ওই "মেটা ক্যারেক্টারের মতই অন্য সাধারণ ম্যাচ করার ক্যারেক্টার" এর মধ্যে পার্থক্য তৈরি করা হয়। **^ এবং $** আরও দুটি বহুল ব্যবহৃত মেটা ক্যারেক্টার হচ্ছে `^` এবং `$`. এ দুটোর মাধ্যমে যথাক্রমে কোন একটি স্ট্রিং এর শুরু এবং শেষ চেক করে দেখা হয়। যেমন, ```python import re pattern = r"^wr.te$" if re.match(pattern, "write"): print("Match 1") if re.match(pattern, "wrote"): print("Match 2") if re.match(pattern, "writer"): print("Match 3") ``` আউটপুট, ```python Match 1 Match 2 ``` উপরের প্রোগ্রামে `r"^wr.te$"` এর মাধ্যমে একটি স্ট্রিং যার শুরু এবং শেষ নির্দিষ্ট অর্থাৎ যথাক্রমে `w` এবং `e` কিন্তু `wr` এর পর যেকোনো ক্যারেক্টার থাকতে পারে এবং সেটির পর আবার `te` থাকতে হবে। তাই `write` এবং `wrote` ম্যাচ করেছে।