কম্পিউটার টিউটোরিয়াল

রেগুলার এক্সপ্রেশন মাস্টার করুন: রিয়েল-ওয়ার্ল্ড উদাহরণসহ প্র্যাকটিক্যাল গাইড

রেগুলার এক্সপ্রেশন কী?

রেগুলার এক্সপ্রেশন, যাকে regexও বলা হয়, প্যাটার্ন ডিফাইন করে কাজ করে যা আপনি স্ট্রিংসের ভিতরে নির্দিষ্ট ক্যারেক্টার বা ওয়ার্ড সার্চ করতে ব্যবহার করতে পারেন।

একবার আপনি যে প্যাটার্নটি ব্যবহার করতে চান সেটি ডিফাইন করলে, আপনি এডিট করতে পারেন, নির্দিষ্ট ক্যারেক্টার বা ওয়ার্ড ডিলিট করতে পারেন, একটা জিনিস অন্য একটা দিয়ে সাবস্টিটিউট করতে পারেন, একটি ফাইল বা যে কোনো স্ট্রিং যেটিতে সেটি নির্দিষ্ট প্যাটার্ন আছে সেটি থেকে প্রাসঙ্গিক তথ্য এক্সট্র্যাক্ট করতে পারেন, ইত্যাদি।

কেন Regex শিখবেন?

Regex আপনাকে টেক্সট প্রসেসিং করতে দেয় এমন একটিভাবে যা আপনার অনেক সময় বাঁচাতে পারে। এটাও প্রসেসে কিছু মজা যোগ করতে পারে।

Regex ব্যবহার করে ইনফরমেশন লোকেট করা অনেক সহজ হয়। একবার আপনি আপনার টার্গেট পেলে, আপনি ব্যাচ এডিট/রিপ্লেস/ডিলিট বা যা প্রসেসিং দরকার সেটি করতে পারেন।

Regex ব্যবহারের কিছু প্র্যাকটিক্যাল উদাহরণ হলো ব্যাচ ফাইল রিনেমিং, লগ পার্সিং, ফর্ম ভ্যালিডেশন, কোডবেসে মাস এডিট করা, এবং রিকার্সিভ সার্চ।

এই টিউটোরিয়ালে, আমরা এই সাইটের সাহায্যে regex বেসিক কভার করব। পরে, আমি কিছু regex চ্যালেঞ্জ দেব যেগুলো আপনি Python ব্যবহার করে সমাধান করবেন। আমি এছাড়া sed এবং grep এর মতো টুলস regex کے সাথে কীভাবে ব্যবহার করবেন তা দেখাব।

জীবনের অনেক জিনিসের মতো, রেগুলার এক্সপ্রেশনও এমন জিনিস যা আপনি শুধু করে সেটি সত্যিকারের বুঝতে পারেন। আমি আপনাকে এই আর্টিকেল পড়ার সময় regex নিয়ে এক্সপেরিমেন্ট করার জন্য উৎসাহিত করছি।

টেবল অফ কন্টেন্টস

  • Regex বেসিক
    • একজাক্ট ম্যাচ
    • ক্যারেক্টার সেট
      • Regex-এ রেঞ্জ ম্যাচ
      • সেটে নেই এমন যেকোনো ক্যারেক্টার ম্যাচ
    • ক্যারেক্টার ক্লাস
    • কোয়ান্টিফায়ার
    • ক্যাপচার গ্রুপ
      • Regex-এ লজিক্যাল OR কীভাবে ব্যবহার করবেন
      • ক্যাপচার গ্রুপ রেফারেন্স কীভাবে করবেন
      • ক্যাপচার গ্রুপ নামকরণ কীভাবে করবেন
  • কমান্ড লাইন টুলসের সাথে regex কীভাবে ব্যবহার করবেন
    • grep দিয়ে রিকার্সিভ regex সার্চ
    • sed দিয়ে সাবস্টিটিউশন
  • অ্যাডভান্সড Regex: লুকআরাউন্ড
    • লুকবিহাইন্ড
    • লুকআহেড
  • Regex-এর প্র্যাকটিক্যাল উদাহরণ
    • লগ পার্সিং
    • বাল্ক ফাইল রিনেমিং
    • ইমেইল ভ্যালিডেশন
    • পাসওয়ার্ড কনস্ট্রেইন্টস
  • শেষ কথা

Regex বেসিক

একটি রেগুলার এক্সপ্রেশন আর কিছু নয় বরং ক্যারেক্টার সিকোয়েন্স যা একটি প্যাটার্ন ম্যাচ করে। লিটারেল ক্যারেক্টার (যেমন 'abc') ব্যবহার করার পাশাপাশি, কিছু মেটা ক্যারেক্টার (*,+,? ইত্যাদি) রয়েছে যাদের স্পেশাল পেরপজ আছে। ক্যারেক্টার ক্লাসের মতো ফিচারও রয়েছে যা আপনার রেগুলার এক্সপ্রেশন সহজ করতে সাহায্য করতে পারে।

যেকোনো regex লিখার আগে, আপনাকে যে প্যাটার্নটি খুঁজছেন তার সব বেসিক কেস এবং এজ কেস সম্পর্কে জানতে হবে।

উদাহরণস্বরূপ, আপনি 'Hello World' ম্যাচ করতে চান, তো কি আপনি চান লাইনটি 'Hello' দিয়ে শুরু হবে নাকি যেকোনো কিছুর সাথে শুরু হতে পারে? 'Hello' এবং 'World'-এর মাঝপথে একজাক্ট একটা স্পেস চান নাকি বেশি হতে পারে? 'World'-এর পরে অন্য ক্যারেক্টার আসতে পারে নাকি লাইনটি সেখানে এন্ড হবে? কেস সেনসিটিভিটি কি আপনার কাছে গুরুত্বপূর্ণ? এবং ऐसे।

এই প্রশ্নগুলোর উত্তর আপনার কাছে থাকা উচিত আপনি regex লিখতে বসে তার আগে।

একজাক্ট ম্যাচ

Regex-এর সবচেয়ে বেসিক ফর্ম হচ্ছে একটি ক্যারেক্টার সিকোয়েন্স ম্যাচ করা টেক্সট এডিটরে Ctrl-F-এ করার মতো।

রেগুলার এক্সপ্রেশন মাস্টার করুন: রিয়েল-ওয়ার্ল্ড উদাহরণসহ প্র্যাকটিক্যাল গাইড

উপরে আপনি ম্যাচের সংখ্যা দেখতে পাচ্ছেন, এবং নিচে ক্যারেক্টার বাই ক্যারেক্টার regex কী ম্যাচ করে সেটির এক্সপ্ল্যানেশন আছে।

ক্যারেক্টার সেট

Regex ক্যারেক্টার সেট আপনাকে একটি গ্রুপ থেকে যেকোনো একক ক্যারেক্টার ম্যাচ করতে দেয়। গ্রুপটি স্কোয়ার ব্র্যাকেট [] দিয়ে ঘেরা থাকে।

উদাহরণস্বরূপ, t[ah]i "tai" এবং "thi" ম্যাচ করে। এখানে 't' এবং 'i' ফিক্সড কিন্তু তাদের মাঝপথে 'a' বা 'h' আসতে পারে।

রেগুলার এক্সপ্রেশন মাস্টার করুন: রিয়েল-ওয়ার্ল্ড উদাহরণসহ প্র্যাকটিক্যাল গাইড

Regex-এ রেঞ্জ ম্যাচ

কখনও কখনও আপনি একটি ক্যারেক্টার গ্রুপ ম্যাচ করতে চাইতে পারেন যেগুলো সিকোয়েনশিয়াল প্রকৃতির, যেমন যেকোনো ইংরেজি বড় হাতের অক্ষর। কিন্তু সকল ২৬টি অক্ষর লিখা বেশ টেডিয়াস হবে।

Regex এই সমস্যা সমাধান করে রেঞ্জ দিয়ে। "-" এক্ট করে রেঞ্জ অপারেটর হিসেবে। কিছু বৈধ রেঞ্জ নিচে দেওয়া হলো:

RangeMatches [A-Z]বড় হাতের অক্ষর [a-z]ছোট হাতের অক্ষর [0-9]যেকোনো ডিজিট

আপনি পার্শিয়াল রেঞ্জও স্পেসিফাই করতে পারেন, যেমন [b-e] 'bcde' অক্ষরগুলোর যেকোনো একটা ম্যাচ করতে বা [3-6] '3456' নম্বরগুলোর যেকোনো একটা ম্যাচ করতে।

রেগুলার এক্সপ্রেশন মাস্টার করুন: রিয়েল-ওয়ার্ল্ড উদাহরণসহ প্র্যাকটিক্যাল গাইড

আপনি ক্যারেক্টার সেটের ভিতরে শুধু একটা রেঞ্জ স্পেসিফাই করতে বাধ্য নন। আপনি একাধিক রেঞ্জ এবং যেকোনো অ্যাডিশনাল ক্যারেক্টারের সাথে কম্বাইন করতে পারেন। এখানে, [3-6u-w;] '3456uvw' বা সেমিকোলন ';' এর যেকোনো একটা ম্যাচ করবে।

রেগুলার এক্সপ্রেশন মাস্টার করুন: রিয়েল-ওয়ার্ল্ড উদাহরণসহ প্র্যাকটিক্যাল গাইড

সেটে নেই এমন যেকোনো ক্যারেক্টার ম্যাচ

আপনি যদি সেটের আগে '^' প্রিফিক্স করেন, তবে ইনভার্স অপারেশন পারফর্ম হবে। উদাহরণস্বরূপ, [^A-Z0-9] বড় হাতের অক্ষর এবং ডিজিট ছাড়া যেকোনো কিছুর সাথে ম্যাচ করবে।

রেগুলার এক্সপ্রেশন মাস্টার করুন: রিয়েল-ওয়ার্ল্ড উদাহরণসহ প্র্যাকটিক্যাল গাইড

ক্যারেক্টার ক্লাস

Regex লিখার সময়, আপনাকে নির্দিষ্ট গ্রুপ যেমন ডিজিট প্রায়ই ম্যাচ করতে হবে এবং একই এক্সপ্রেশনে একাধিকবার।

তাহলে উদাহরণস্বরূপ, আপনি 'letter-digit-letter-digit' এর মতো প্যাটার্ন কীভাবে ম্যাচ করবেন?

আপনি যা अबতক শিখেছেন তার اساسে, আপনি [a-zA-Z]-[0-9]-[a-zA-z]-[0-9] বের করতে পারেন। এটা কাজ করে, কিন্তু আপনি দেখতে পাচ্ছেন প্যাটার্নের দৈর্ঘ্য বড় হলে এক্সপ্রেশন কতটা গোলমাল হয়ে যেতে পারে।

এক্সপ্রেশন সহজ করতে, চিরপরিচিত ক্যারেক্টার গ্রুপ যেমন ডিজিটের জন্য ক্লাস অ্যাসাইন করা হয়েছে। নিচের টেবিলে এই ক্লাসগুলো এবং ক্যারেক্টার সেটের সাথে তাদের ইকুিভ্যালেন্ট এক্সপ্রেশন দেখানো হলো:

ClassMatchesEquivalent expression .নিউলাইন ছাড়া যেকোনো ক্যারেক্টার[^\n\r] \wওয়ার্ড ক্যারেক্টার[a-zA-Z0-9_] \Wনন-ওয়ার্ড ক্যারেক্টার[^\w] \dডিজিট[0-9] \Dনন-ডিজিট[^\d] \sস্পেস, ট্যাব, নিউলাইন[ \t\r\n\f] \Sনন হোয়াইটস্পেস ক্যারেক্টার[^\s]

ক্যারেক্টার ক্লাস খুব হ্যান্ডি এবং আপনার এক্সপ্রেশন অনেক ক্লিন করে। এই টিউটোরিয়ালে আমরা এগুলো ব্যাপকভাবে ব্যবহার করব, তাই এই টেবিলকে রেফারেন্স পয়েন্ট হিসেবে ব্যবহার করুন এবং যদি কোনো ক্লাস ভুলে যান তবে এখানে ফিরে আসুন।

অধিকাংশ সময়, আমরা একটি প্যাটার্নের সব পজিশনকে কেয়ার করি না। "." ক্লাস আমাদের সব সম্ভাব্য ক্যারেক্টার সেটে লিখতে বাঁচায়।

উদাহরণস্বরূপ, t.. 't' দিয়ে শুরু হওয়া যেকোনো জিনিস এবং তার পর যেকোনো দুটি ক্যারেক্টার ম্যাচ করে। এটি আপনাকে SQL LIKE অপারেটরকে মনে করাতে পারে যা t%% ব্যবহার করে একই কাজ করে।

রেগুলার এক্সপ্রেশন মাস্টার করুন: রিয়েল-ওয়ার্ল্ড উদাহরণসহ প্র্যাকটিক্যাল গাইড

কোয়ান্টিফায়ার

"প্যাটার্ন" এবং "রিপিটিশন" হাত ধরে হাত দিয়ে চলে। আপনি যদি ৩ ডিজিটের নাম্বার ম্যাচ করতে চান, তবে \d\d\d ব্যবহার করতে পারেন। কিন্তু ১১ ডিজিট ম্যাচ করতে চাইলে? আপনি '\d' ১১ বার লিখতে পারেন, কিন্তু প্রোগ্রামিং বা regex লিখার সময় একটি সাধারণ রুল অফ থাম্ব হলো যদি আপনি একই জিনিস দুবারից বেশি রিপিট করছেন, তবে আপনি সম্ভবত কোনো ফিচারের অজান্তে আছেন।

Regex-এ, আপনি এই উদ্দেশ্যে কোয়ান্টিফায়ার ব্যবহার করতে পারেন। ১১ ডিজিট ম্যাচ করতে, আপনি সিম্পলি এক্সপ্রেশন \d{11} লিখতে পারেন।

নিচের টেবিলে regex-এ ব্যবহারযোগ্য কোয়ান্টিফায়ারগুলো লিস্ট করা হলো:

QuantifierMatches *০ বা অধিক ?০ বা ১ +১ বা অধিক {n}একজাক্ট n বার {n, }n বা অধিক বার {n, m}n থেকে m বার ইনক্লूसিভ

এই উদাহরণে, এক্সপ্রেশন can\s+write ম্যাচ করে can ফলো করা ১ বা অধিক হোয়াইটস্পেস ফলো করা write। কিন্তু আপনি দেখতে পাচ্ছেন 'canwrite' ম্যাচ হয়নি কারণ \s+ মানে কমপক্ষে একটি হোয়াইটস্পেস ম্যাচ করতে হবে। এটি উপযোগী যখন আপনি আনট্রিমড টেক্সটে সার্চ করছেন।

রেগুলার এক্সপ্রেশন মাস্টার করুন: রিয়েল-ওয়ার্ল্ড উদাহরণসহ প্র্যাকটিক্যাল গাইড

আপনি অনুমান করতে পারেন can\s?write কী ম্যাচ করবে?

ক্যাপচার গ্রুপ

ক্যাপচার গ্রুপ হলো প্যারেনথেসিস () দিয়ে ঘেরা সাব-এক্সপ্রেশন। আপনি যেকোনো সংখ্যক ক্যাপচার গ্রুপ, এবং নেস্টেড ক্যাপচার গ্রুপও রাখতে পারেন।

এক্সপ্রেশন (The ){2} 'The ' দুবার ম্যাচ করে। কিন্তু ক্যাপচার গ্রুপ ছাড়া, এক্সপ্রেশন The {2} 'The' ফলো করা ২ স্পেস ম্যাচ করবে, কারণ কোয়ান্টিফায়ার স্পেস ক্যারেক্টারের ওপর অ্যাপ্লাই হবে 'The ' গ্রুপের ওপর না।

রেগুলার এক্সপ্রেশন মাস্টার করুন: রিয়েল-ওয়ার্ল্ড উদাহরণসহ প্র্যাকটিক্যাল গাইড

আপনি যেকোনো বৈধ regex-এর মতো ক্যাপচার গ্রুপের ভিতরে যেকোনো প্যাটার্ন ম্যাচ করতে পারেন। এখানে (is\s+){2} ম্যাচ করবে যদি 'is' ফলো করা ১ বা অধিক স্পেস দুবার পাওয়া যায়।

রেগুলার এক্সপ্রেশন মাস্টার করুন: রিয়েল-ওয়ার্ল্ড উদাহরণসহ প্র্যাকটিক্যাল গাইড

Regex-এ লজিক্যাল OR কীভাবে ব্যবহার করবেন

আপনি "|" ব্যবহার করে একাধিক প্যাটার্ন ম্যাচ করতে পারেন। This is (good|bad|sweet) ম্যাচ করে 'This is ' ফলো করা 'good' বা 'bad' বা 'sweet'-এর যেকোনো একটা।

রেগুলার এক্সপ্রেশন মাস্টার করুন: রিয়েল-ওয়ার্ল্ড উদাহরণসহ প্র্যাকটিক্যাল গাইড

আবার ক্যাপচার গ্রুপের গুরুত্ব বুঝুন। চিন্তা করুন এক্সপ্রেশন This is good|bad|sweet কী ম্যাচ করবে?

রেগুলার এক্সপ্রেশন মাস্টার করুন: রিয়েল-ওয়ার্ল্ড উদাহরণসহ প্র্যাকটিক্যাল গাইড

ক্যাপচার গ্রুপ থাকলে, good|bad|sweet আলাদা থাকে This is-থেকে। কিন্তু যদি ক্যাপচার গ্রুপে না থাকে, তবে পুরো regex শুধু একটা গ্রুপ। তাই এক্সপ্রেশন This is good|bad|sweet ম্যাচ করবে যদি স্ট্রিংএ 'This is good' বা 'bad' বা 'sweet' থাকে।

ক্যাপচার গ্রুপ রেফারেন্স কীভাবে করবেন

ক্যাপচার গ্রুপকে একই এক্সপ্রেশনে বা রিপ্লেসমেন্ট করার সময় রেফারেন্স করা যায় যেমন আপনি Replacement ট্যাবে দেখতে পাচ্ছেন।

বেশিরভাগ টুল এবং ল্যাঙ্গুয়েজ আপনাকে nth ক্যাপচার্ড গ্রুপ '\n'- দিয়ে রেফারেন্স করতে দেয়। এই সাইটে রিপ্লেসমেন্টে রেফারেন্স করার জন্য '$n' ব্যবহার করা হয়। রিপ্লেসমেন্টের সিনট্যাক্স টুল বা ল্যাঙ্গুয়েজ অনুযায়ী ভিন্ন হবে। JavaScript-এর জন্য, উদাহরণস্বরূপ, '$n', Python-এর জন্য '\n'।

এক্সপ্রেশন (This) is \1 power-এ, 'This' ক্যাপচার হয় এবং '\1'-দিয়ে রেফারেন্স করা হয়, কার্যকরভাবে This is This power ম্যাচ করে।

রেগুলার এক্সপ্রেশন মাস্টার করুন: রিয়েল-ওয়ার্ল্ড উদাহরণসহ প্র্যাকটিক্যাল গাইড

ক্যাপচার গ্রুপ নামকরণ কীভাবে করবেন

আপনি আপনার ক্যাপচার গ্রুপ নাম দিতে পারেন সিনট্যাক্স (?<name>pattern) দিয়ে এবং সেম এক্সপ্রেশনে \k<name> দিয়ে ব্যাকরেফারেন্স করতে পারেন।

রিপ্লেসমেন্টে, রেফারেন্সিং করা হয় $<name> দিয়ে। এটি JavaScript-এর সিনট্যাক্স এবং ল্যাঙ্গুয়েজ অনুযায়ী ভিন্ন হতে পারে। আপনি পার্থক্যগুলো সম্পর্কে এখানে জানতে পারেন। এছাড়া নোট করুন যে এই ফিচার কিছু ল্যাঙ্গুয়েজে উপলব্ধ নাও হতে পারে।

এক্সপ্রেশন (?<lang>[\w+]+) is the best but \k<lang> .*-এ, প্যাটার্ন [\w+]+ 'lang' নাম দিয়ে ক্যাপচার হয় এবং \k<lang> দিয়ে ব্যাকরেফারেন্স করা হয়। এই প্যাটার্ন যেকোনো ওয়ার্ড ক্যারেক্টার বা '+' ক্যারেক্টার ১ বা অধিকবার ম্যাচ করবে। রেজেক্সের শেষে .* যেকোনো ক্যারেক্টার ০ বা অধিকবার ম্যাচ করে। এবং অবশেষে রিপ্লেসমেন্টে, রেফারেন্সিং করা হয় $<lang> দিয়ে।

রেগুলার এক্সপ্রেশন মাস্টার করুন: রিয়েল-ওয়ার্ল্ড উদাহরণসহ প্র্যাকটিক্যাল গাইড

কিছু ভালো CLI টুল রয়েছে যা আপনাকে টার্মিনাল থেকে regex পারফর্ম করতে দেয়। এই টুলস আপনাকে আরও সময় বাঁচায় কারণ আপনি সহজে বিভিন্ন regex টেস্ট করতে পারেন কোনো ল্যাঙ্গুয়েজে কোড লিখে কম্পাইল বা ইন্টারপ্রেট ছাড়া।

প্রসিদ্ধ টুলগুলোর মধ্যে রয়েছে grep, sed, এবং awk। আসুন কিছু উদাহরণ দেখি যাতে আপনি বুঝতে পারেন কীভাবে এই টুলস ব্যবহার করতে পারেন।

grep দিয়ে রিকার্সিভ regex সার্চ

আপনি grep-এর মাধ্যমে regex-এর পাওয়ার এক্সিকিউট করতে পারেন। Grep একটি ফাইলে প্যাটার্ন সার্চ করতে পারে বা রিকার্সিভ সার্চ করতে পারে।

আপনি যদি উইন্ডোজে হন, তবে winget ব্যবহার করে grep ইনস্টল করতে পারেন। PowerShell-এ এই কমান্ড চালান:

winget install -e --id GnuWin32.Grep 

আমি আমার ইউনিভার্সিটিতে একটি CTF কম্পিটিশনের জন্য তৈরি একটি চ্যালেঞ্জের সমাধান দেখাব।

চ্যালেঞ্জের সাথে আট্যাচড ফাইলটি একটি zip ফাইল যাতে একাধিক লেভেলের ডিরেক্টরি এবং অনেক ফাইল রয়েছে। কম্পিটিশনের নাম ছিল Coderush ফ্ল্যাগ ফরম্যাট coderush{flag is here}। তাই আপনাকে প্যাটার্ন coderush{.*} সার্চ করতে হবে যা ফ্ল্যাগ ফরম্যাট coderush{any character here} ম্যাচ করবে।

unzip ripG.zip দিয়ে আনজিপ করুন এবং cd ripG দিয়ে ভিতরে যান।

রেগুলার এক্সপ্রেশন মাস্টার করুন: রিয়েল-ওয়ার্ল্ড উদাহরণসহ প্র্যাকটিক্যাল গাইড

এখানে ৩৫৮টি ডিরেক্টরি এবং ৮৭৩১টি ফাইল রয়েছে। এক এক করে ফাইলে প্যাটার্ন সার্চ করার বদলে, আপনি grep ব্যবহার করতে পারেন এইভাবে:

grep --color -R "coderush{.*}" 

"-R" ফ্ল্যাগ রিকার্সিভ সার্চ এনাবল করে।

রেগুলার এক্সপ্রেশন মাস্টার করুন: রিয়েল-ওয়ার্ল্ড উদাহরণসহ প্র্যাকটিক্যাল গাইড

আপনি grep এবং এর কমান্ড লাইন অপশন সম্পর্কে এখানে আরও জানতে পারেন

sed দিয়ে সাবস্টিটিউশন

আপনি sed ব্যবহার করে টেক্সট ফাইলে ইনসারশন, ডিলিশন, সাবস্টিটিউশন পারফর্ম করতে পারেন একটি regex স্পেসিফাই করে। আপনি যদি উইন্ডোজে হন, তবে আপনি sed এখানে থেকে পেতে পারেন। অথবা আপনি WSL ব্যবহার করলে, grep এবং sed-এর মতো টুলস ইতিমধ্যে উপলব্ধ থাকবে।

sed-এর সবচেয়ে সাধারণ ব্যবহার:

sed 's/pattern/replacement/g' filename echo "${text}" | sed 's/pattern/replacement/g' 

এখানে, "g" অপশন স্পেসিফাই করা হয়েছে সব অকরেন্স রিপ্লেস করতে।

অন্যান্য কিছু উপযোগী অপশন হলো -n ডিফল্ট বিহেভিয়র (সকল লাইন প্রিন্ট করা) সাপ্রেস করতে এবং g-র বদলে p ব্যবহার করে শুধু regex দ্বারা আফেক্টেড লাইনগুলো প্রিন্ট করতে।

texts.txt-এর কন্টেন্ট দেখি।

Hello rand chars World 56 rand chars Henlo 52 rand chars W0rld rand chars GREP rand chars Henlo 62 rand chars Henlo 10 rand chars Henlo rand chars GREP rand chars Henlo 45 rand chars 

আমাদের টাস্ক হলো Henlo number কে Hello number দিয়ে রিপ্লেস করা শুধু যেসব লাইনে "GREP" আছে। তাই, আমরা প্যাটার্ন Henlo ([0-9]+) সার্চ করছি যা 'Henlo ' ফলো করা ১ বা অধিক ডিজিট ম্যাচ করবে এবং সব ডিজিট ক্যাপচার হবে। তারপর আমাদের রিপ্লেসমেন্ট স্ট্রিং হবে Hello \1 – '\1' ডিজিট সম্বলিত ক্যাপচার গ্রুপকে রেফারেন্স করছে।

এই কাজ করার একটি উপায় হলো grep ব্যবহার করে "GREP" উপস্থিত লাইনগুলো গ্রেপ করা তারপর sed দিয়ে রিপ্লেসমেন্ট করা।

grep "GREP" texts.txt | sed -En 's/Henlo ([0-9]+)/Hello \1/p' 

"-E" অপশন এক্সটেন্ডেড regex এনাবল করে যার বিনা আপনাকে প্যারেনথেসিস এস্কেপ করতে হতো।

রেগুলার এক্সপ্রেশন মাস্টার করুন: রিয়েল-ওয়ার্ল্ড উদাহরণসহ প্র্যাকটিক্যাল গাইড

অথবা আপনি শুধু sed ব্যবহার করতে পারেন। /pattern/ ব্যবহার করে শুধু যেসব লাইনে প্যাটার্ন আছে সেখানে সাবস্টিটিউশন রেস্ট্রিক্ট করুন।

sed -En '/GREP/ s/Henlo ([0-9]+)/Hello \1/p' texts.txt 

অ্যাডভান্সড Regex: লুকআরাউন্ড

লুকআহেড এবং লুকবিহাইন্ড (একসাথে লুকআরাউন্ড হিসেবে পরিচিত) regex-এর ऐसी ফিচার যা আপনাকে একটি প্যাটার্নের অস্তিত্ব চেক করতে দেয় সেটি ম্যাচে ইনক্লুড না করেই।

আপনি এগুলোকে জিরো-উইডথ অ্যাসারশন হিসেবে ভাবতে পারেন – তারা একটি প্যাটার্নের অস্তিত্ব অ্যাসার্ট করে কিন্তু ম্যাচে কোনো ক্যারেক্টার কনসুম করে না। এগুলো খুব শক্তিশালী ফিচার, কিন্তু কমপিউটেশনালি এক্সপেনসিভ। তাই আপনি যদি এগুলো প্রায়শই ব্যবহার করেন, তবে পারফরম্যান্সে চোখ রাখুন।

লুকবিহাইন্ড

ধরা যাক আপনি 'linux' ওয়ার্ডটি ম্যাচ করতে চান, কিন্তু ২টি শর্ত আছে।

  1. 'GNU' শব্দটি 'linux'-এর আগে থাকতে হবে। যদি একটি লাইনে 'linux' থাকে কিন্তু তার আগে 'GNU' না থাকে, তবে আমরা সেই লাইন ডিসকার্ড করব।
  2. আমরা শুধু linux ম্যাচ করতে চাই এবং কিছুই নয়।

আমরা ইতিমধ্যে জানি ১ম শর্ত কীভাবে পূরণ করব। GNU.* ম্যাচ করবে 'GNU' ফলো করা যেকোনো সংখ্যক ক্যারেক্টার। তারপর অবশেষে আমরা ওয়ার্ড linux ম্যাচ করি। এটি GNU-any-characters-linux সব ম্যাচ করবে।

রেগুলার এক্সপ্রেশন মাস্টার করুন: রিয়েল-ওয়ার্ল্ড উদাহরণসহ প্র্যাকটিক্যাল গাইড

কিন্তু GNU.* ম্যাচ না করিয়ে আমরা ১ম শর্ত কীভাবে মেইনটেইন করব?

সেটাই পজিটিভ লুকবিহাইন্ড কাজে লাগে। আপনি একটি ক্যাপচার গ্রুপকে পজিটিভ লুকবিহাইন্ড হিসেবে মার্ক করতে পারেন ?<= প্রিফিক্স করে। এই উদাহরণে, এক্সপ্রেশন হয়ে যায় (?<=GNU.*)linux।

রেগুলার এক্সপ্রেশন মাস্টার করুন: রিয়েল-ওয়ার্ল্ড উদাহরণসহ প্র্যাকটিক্যাল গাইড

এখন শুধু linux ম্যাচ হয় এবং কিছুই নয়।

নোট করুন যে এক্সপ্রেশন (?<=GNU.*)linux এবং linux(?<=GNU.*) একই ভাবে বিহেভ করবে। ২য় এক্সপ্রেশনে, যদিও linux লুকবিহাইন্ডের আগে, .* 'GNU'-এর পরে linux ম্যাচ করে। এর মানে লুকবিহাইন্ড স্যাটিসফাই হয়।

একে সহজ করতে, লুকবিহাইন্ড ছাড়া প্যাটার্নটি চিন্তা করুন। প্যাটার্ন GNU.* 'GNU' এবং তার পর যেকোনো জিনিস ম্যাচ করবে, আমাদের কেসে linux ম্যাচ করবে।

এখন আমরা একটি জেনারেলাইজড স্টেটমেন্ট বের করতে পারি যে এক্সপ্রেশন (?<=C)X প্যাটার্ন X ম্যাচ করবে – শুধু যদি প্যাটার্ন C, X-এর আগে আসে (এবং C ম্যাচে ইনক্লুডেড নয়)।

আপনি ১ম শর্ত রিভার্সও করতে পারেন। সেই লাইনগুলো ম্যাচ করুন যাতে ওয়ার্ড linux থাকে শুধু যদি GNU কখনো তার আগে আসে না। এটাকে নেগেটিভ লুকবিহাইন্ড বলে। এই কেসে প্রিফিক্স হলো ?<!। পिछল এক্সপ্রেশনের ইনভার্স হবে (?<!GNU.*)linux।

রেগুলার এক্সপ্রেশন মাস্টার করুন: রিয়েল-ওয়ার্ল্ড উদাহরণসহ প্র্যাকটিক্যাল গাইড

লুকআহেড

লুকআহেডও লুকবিহাইন্ডের মতো অ্যাসারশন, যেমন আপনি পिछল উদাহরণে দেখেছেন। একমাত্র পার্থক্য হলো লুকবিহাইন্ড অ্যাসারশন আগে করে এবং লুকআহেড অ্যাসারশন পরে করে।

ধরা যাক আপনার এই দুটি শর্ত আছে:

  1. Hello ম্যাচ করুন শুধু যদি World এর পর কোথাও আসে।
  2. শুধু Hello ম্যাচ করুন এবং কিছুই নয়।

পজিটিভ লুকআহেডের প্রিফিক্স হলো ?=। এক্সপ্রেশন Hello(?=.*World) দুটি শর্ত পূরণ করবে। এটি Hello.*World-এর মতো কিন্তু শুধু Hello ম্যাচ হবে যেখানে Hello.*World 'Hello', 'World' এবং মাঝপথের সব কিছুর সাথে ম্যাচ করবে।

রেগুলার এক্সপ্রেশন মাস্টার করুন: রিয়েল-ওয়ার্ল্ড উদাহরণসহ প্র্যাকটিক্যাল গাইড

পজিটিভ লুকবিহাইন্ডের উদাহরণের মতো, এক্সপ্রেশন Hello(?=.*World) এবং (?=.*World)Hello একুিভ্যালেন্ট। কারণ .* 'World'-এর আগে Hello ম্যাচ করে, ১ম শর্ত স্যাটিসফাই করে।

নেগেটিভ লুকআহেড নেগেটিভ লুকবিহাইন্ডের কমপ্লিমেন্ট। আপনি এটি ?! প্রিফিক্স করে ব্যবহার করতে পারেন। (?!World)Hello Hello ম্যাচ করবে শুধু যদি তার পরে কোথাও World না থাকে।

রেগুলার এক্সপ্রেশন মাস্টার করুন: রিয়েল-ওয়ার্ল্ড উদাহরণসহ প্র্যাকটিক্যাল গাইড

নিচে লুকআরাউন্ডের সিনট্যাক্সের সারাংশ দেওয়া হলো প্যাটার্ন X অ্যাসারশন C-সহ ম্যাচ করার জন্য।

OperationRegEx positive lookahead(?=C)X negative lookahead(?!C)X positive lookbehind(?<=C)X negative lookbehind(?<!C)X

লগ পার্সিং

এই লগ ফাইলে, এই লাইনগুলোই আমাদের কেয়ার করার লাইন:

[1/10000] Train loss: 11.30368, Valid loss: 8.95446, Elapsed_time: 7.58941 [500/10000] Train loss: 0.96180, Valid loss: 0.20098, Elapsed_time: 82.48651 [1000/10000] Train loss: 0.04051, Valid loss: 0.11927, Elapsed_time: 156.86243 

আমাদের টাস্ক হলো ট্রেনিং লস এবং ভ্যালিডেশন লস এক্সট্র্যাক্ট করা প্লটিং লস ওভার ইপোকসের মতো কাজের জন্য। আমাদের ট্রেনিং লস ভ্যালুগুলো এক্সট্র্যাক্ট করতে হবে যেমন 11.30368, 0.96180, 0.04051 এবং সেগুলো একটি অ্যারেতে রাখতে হবে।

সাব রিলেভান্ট ভ্যালুগুলো 'Train loss:' প্রিফিক্সড, তাই আমরা আমাদের regex-এ এটিকেそのまま ব্যবহার করতে পারি। ফ্লোট নাম্বার ম্যাচ করতে হলে আমাদের কিছু ডিজিট ফলো করা একটি "." এবং তারপর আরও ডিজিট ম্যাচ করতে হবে। আপনি এটা \d+\.\d+ দিয়ে করতে পারেন। কারণ আমরা এই নাম্বারগুলো ট্র্যাক রাখতে চাই, সেগুলো ক্যাপচার গ্রুপের ভিতরে থাকা উচিত।

regex-এ "." স্পেশাল পেরপজ রাখে, তাই আপনি যখন "." ক্যারেক্টার ম্যাচ করতে চান, তখন আপনাকে ব্যাকস্ল্যাশ দিয়ে এস্কেপ করতে হবে। এটি সব স্পেশাল পেরপজ دار ক্যারেক্টারের জন্য প্রযোজ্য। কিন্তু ক্যারেক্টার সেটের ভিতরে এস্কেপ করতে হয় না।

সব কিছু একসাথে করলে, ট্রেনিং লস এক্সট্র্যাক্ট করার এক্সপ্রেশন হলো Train loss: (\d+\.\d+)। আমরা একই লজিক ব্যবহার করে ভ্যালিডেশন লস এক্সট্র্যাক্ট করতে পারি Valid loss: (\d+\.\d+) দিয়ে।

Python ব্যবহার করে এই ইনফরমেশন এক্সট্র্যাক্ট করার একটি উপায়:

import re f = open("log_train.txt", "r").read() train_loss = re.findall(r'Train loss: (\d+\.\d+)', f) valid_loss = re.findall(r'Valid loss: (\d+\.\d+)', f) train_loss = [float(i) for i in train_loss] valid_loss = [float(i) for i in valid_loss] print("train_loss =", train_loss) print("") print("valid_loss =", valid_loss) 

যখন একটি ক্যাপচার গ্রুপ থাকে, re.findall সব লাইন সার্চ করে এবং ক্যাপচার গ্রুপের ভিতরের ভ্যালুগুলো একটি লিস্টে রিটার্ন করে।

যেকোনো regex ফাংশন শুধু স্ট্রিং রিটার্ন করে, তাই ভ্যালুগুলো ফ্লোটে কনভার্ট করা হয় এবং প্রিন্ট আউট করা হয়। তারপর আপনি সেগুলো ডায়রেক্টলি অন্য Python স্ক্রিপ্টে ফ্লোটের লিস্ট হিসেবে ব্যবহার করতে পারেন।

এটি রেজাল্ট:

রেগুলার এক্সপ্রেশন মাস্টার করুন: রিয়েল-ওয়ার্ল্ড উদাহরণসহ প্র্যাকটিক্যাল গাইড

আপনি sedও ব্যবহার করতে পারেন, আউটপুট train_losses.txt-এ সেভ করে, এবং ফাইল থেকে পড়ুন। প্রথমে '/Train/' ব্যবহার করে শুধু যেসব লাইনে 'Train' আছে সেগুলো টার্গেট করুন তারপর আগের মতো একই regex অ্যাপ্লাই করুন।

sed -En '/Train/ s/.*Train loss: ([0-9]+\.[0-9]+).*/\1/p' log_train.txt | tee train_losses.txt 

".*" স্টার্ট এবং এন্ডে অ্যাড করা হয়েছে যাতে sed রিলেভান্ট লাইনগুলোর কন্টেন্ট ম্যাচ করে। তারপর পুরো লাইন ক্যাপচার গ্রুপের ভ্যালু দ্বারা রিপ্লেস করা হয়। tee কমান্ড sed-এর আউটপুট train_losses.txt-এ রিডাইরেক্ট করতে ব্যবহৃত হয় একসাথে টার্মিনালে কন্টেন্ট প্রিন্ট করতেও।

রেগুলার এক্সপ্রেশন মাস্টার করুন: রিয়েল-ওয়ার্ল্ড উদাহরণসহ প্র্যাকটিক্যাল গাইড

একটু চিন্তা করুন ইপোকস এক্সট্র্যাক্ট করতে আপনার কী লাগবে। [500/10000]-এর থেকে ৫০০ এক্সট্র্যাক্ট করতে হবে সকল এমন লাইনের জন্য। অ্যারেটি দেখতে হবে [1, 500, 1000, 1500, ...] এর মতো। আপনি আগের উদাহরণের মতো একই পদ্ধতি ফলো করতে পারেন।

নোট করুন যে আপনি যদি "[" বা "]" ম্যাচ করতে চান, তবে এস্কেপ করতে হবে। উত্তর এখানে দেওয়া আছে।

বাল্ক ফাইল রিনেমিং

আপনার কাছে এই ফাইলগুলো আছে কিছু র‍্যান্ডম ভ্যালু প্রিফিক্স হিসেবে। আপনাকে সব ফাইল 1.mp4, 2.mp4 ইত্যাদি হিসেবে রিনেম করতে হবে। ফাইলগুলো কীভাবে জেনারেট হয়েছিল:

রেগুলার এক্সপ্রেশন মাস্টার করুন: রিয়েল-ওয়ার্ল্ড উদাহরণসহ প্র্যাকটিক্যাল গাইড

এটি একটি সাধারণ পরিস্থিতি যেখানে আপনার কাছে ফাইলগুলো আছে যাদের নামে তাদের সিকোয়েন্স নাম্বার আছে কিন্তু কিছু অন্য ক্যারেক্টারও আছে যা আপনি চান না।

প্যাটার্নটি ম্যাচ করতে হবে Episode পর্যন্ত যেকোনো কিছুর সাথে তারপর আন্ডারস্কোর এবং তারপর নাম্বার এবং শেষে .mp4।

রিলেভান্ট ভ্যালু হলো '.mp4'-এর আগের নাম্বার যা আমরা ক্যাপচার গ্রুপে রাখব। .*Episode_ নাম্বার পর্যন্ত সব কিছু ম্যাচ করবে। তারপর আমরা নাম্বার ক্যাপচার করতে পারি ([0-9]+) দিয়ে এবং .mp4 ম্যাচ করতে পারি \.mp4 দিয়ে।

তাই ফাইনাল regex হলো .*Episode_([0-9]+)\.mp4। আমরা .mp4 রাখতে চাই তাই রিপ্লেসমেন্ট স্ট্রিং হবে \1.mp4।

sed ব্যবহার করে সমাধান করার একটি উপায়:

for i in *.mp4; do newname=$(echo $i | sed -En 's/.*Episode_([0-9]+)\.mp4/\1.mp4/p') mv $i $newname done;ls 

প্রথমে নতুন নাম একটি ভেরিয়েবলে সেভ করা হয় এবং তারপর mv কমান্ড ব্যবহার করে ফাইল রিনেম করা হয়।

রেগুলার এক্সপ্রেশন মাস্টার করুন: রিয়েল-ওয়ার্ল্ড উদাহরণসহ প্র্যাকটিক্যাল গাইড

আমরা কি শুধু .* ব্যবহার করতে পারতাম .*Episode_-এর বদলে? এই উদাহরণে, হ্যাঁ। কিন্তু ফাইলনেম হতে পারে Steins_Gate0.mp4 যেখানე 0 মুভির নামের অংশ এবং আপনি সেটি রিনেম করতে চান না তাই যতটা সম্ভব স্পেসিফিক হওয়া ভালো।

কিছু ফাইল যদি "Random_Episode6.mp4" নামে থাকে? পার্থক্য হলো, Episode-এর পর আন্ডারস্কোর নেই। আপনি কী পরিবর্তন আনবেন?

উত্তর হলো আপনাকে "_" এর পর "?" যোগ করতে হবে इसे অপশনাল করার জন্য। Regex হবে .*Episode_?([0-9]+)\.mp4।

ইমেইল ভ্যালিডেশন

ইমেইল ভ্যালিডেশনের জন্য সব ধরনের কমপ্লেক্স regex রয়েছে।

এখানে একটি সিম্পলটি: ^[^@ ]+@[^@.]+\.\w+$। এটি A@B.C ফরম্যাট ম্যাচ করে।

নিচের টেবিল এই প্যাটার্নকে ছোট ছোট টুকরোতে ভাগ করে দেখিয়েছে:

PatternMatches ^লাইন শুরু [^@ ]+"@" এবং স্পেস ক্যারেক্টার ছাড়া যেকোনো কিছুর @[^@.]+"@" ফলো করা "@" এবং "." ক্যারেক্টার ছাড়া যেকোনো কিছুর \.\w+"." ফলো করা ওয়ার্ড ক্যারেক্টার $লাইন শেষ

রেগুলার এক্সপ্রেশন মাস্টার করুন: রিয়েল-ওয়ার্ল্ড উদাহরণসহ প্র্যাকটিক্যাল গাইড

regexr সাইটে, আপনি.upper right corner-এ Flags ট্যাব থেকে multiline ফ্ল্যাগ এনাবল করতে পারেন। শেষে 'gm' ইন্ডিকেট করে যে multiline ফ্ল্যাগ এনাবলড।

আমরা দেখতে পাচ্ছি লাইন ২,৩,৫,৬ ম্যাচ করেনি। আপনি কারণ এবং regex-এর কোন অংশটি দায়ী তা খুঁজে বের করতে পারেন?

উত্তর এখানে দেওয়া আছে

পাসওয়ার্ড কনস্ট্রেইন্টস

আপনি regex ব্যবহার করে কনস্ট্রেইন্টও ইমপোজ করতে পারেন। এখানে আমরা পজিটিভ লুকআহেডের পাওয়ার আনকভার করব।

ধরা যাক আমরা একটি স্ট্রিং একসেপ্ট করতে চাই শুধু যদি সেটিতে একটি ডিজিট থাকে। আপনি ইতিমধ্যে জানেন '\d' ক্লাস দিয়ে ডিজিট খুঁজে বের করা। সেটি অর্জন করতে, আমরা [^\d]*\d ব্যবহার করতে পারি। এটি যেকোনো নন-ডিজিট ক্যারেক্টার ০ বা অধিকবার ম্যাচ করবে এবং তারপর একটি ডিজিট ম্যাচ করবে।

আমরা এক্সপ্রেশন .*\dও ব্যবহার করতে পারি একটি ডিজিট ম্যাচ করতে। তাই যদি স্ট্রিংএ কোনো ডিজিট না থাকে, তবে লুকআহেড ফেইল করবে এবং সেই স্ট্রিংএর কোনো ক্যারেক্টার ম্যাচ হবে না, খালি স্ট্রিং "" রিটার্ন করবে।

যখন আমরা প্রোগ্রামিং ল্যাঙ্গুয়েজ ব্যবহার করি, আমরা চেক করতে পারি regex খালি স্ট্রিং রিটার্ন করল কিনা এবং নির্ধারণ করতে পারি কনস্ট্রেইন্টস স্যাটিসফাইড হয়েছে কিনা।

আমরা একটি regex তৈরি করব যা নিচের κριটেরিয়া ইমপোজ করবে:

  1. ন্যূনতম ৮ ক্যারেক্টার এবং সর্বোচ্চ ১৬ ক্যারেক্টার।
  2. কমপক্ষে একটা ছোট হাতের অক্ষর।
  3. কমপক্ষে একটা বড় হাতের অক্ষর।
  4. কমপক্ষে একটা নাম্বার।

এটি অর্জন করতে, আপনি পজিটিভ লুকআহেড ব্যবহার করতে পারেন।Regexটি হলো:

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,16}$

নিচের টেবিল ব্যাখ্যা করে regex-এর কোন অংশটি কোন কনস্ট্রেইন্ট ইমপোজ করে:

PatternImposed Constraint .{8,16}মিন ৮ এবং ম্যাক্স ১৬ ক্যারেক্টার (?=.*[a-z])মিনিমাম একটা ছোট হাতের অক্ষর (?=.*[A-Z])মিনিমাম একটা বড় হাতের অক্ষর (?=.*\d)মিনিমাম একটা ডিজিট

রেগুলার এক্সপ্রেশন মাস্টার করুন: রিয়েল-ওয়ার্ল্ড উদাহরণসহ প্র্যাকটিক্যাল গাইড

কমপক্ষে ৫টি বড় হাতের অক্ষর ইমপোজ করতে আপনার কী মডিফিকেশন দরকার?

আপনি ভাবতে পারেন (?=.*[A-Z]{5,}) কাজ করবে। কিন্তু এই এক্সপ্রেশন ৫টি অক্ষর একসাথে থাকতে বাধ্য করে। rand-ABCDE-rand ম্যাচ হবে কিন্তু 0AxBCDxE0 ম্যাচ হবে না যদিও সেটিতে ৫টি বড় হাতের অক্ষর আছে (কারণ সেগুলো অ্যাডজেসেন্ট নয়)।

এবারও ক্যাপচার গ্রুপ রক্ষা করল। আমরা স্ট্রিং-এর যেকোনো জায়গায় ৫টি বড় হাতের অক্ষর ম্যাচ করতে চাই। আমরা ইতিমধ্যে জানি ১টি বড় হাতের অক্ষর .*[A-Z] দিয়ে ম্যাচ করা যায়। এখন সেগুলো ক্যাপচার গ্রুপে রাখব এবং মিনিমাম ৫ কোয়ান্টিফায়ার অ্যাটাচ করব। এক্সপ্রেশন হবে (.*[A-Z]){5,}।

ফাইনাল উত্তর:

(?=.*[A-Z])-র জায়গায় আপনাকে (?=(.*[A-Z]){5,}) দরকার। এক্সপ্রেশন হয়ে যায় ^(?=.*[a-z])(?=(.*[A-Z]){5,})(?=.*\d).{8,16}$।

রেগুলার এক্সপ্রেশন মাস্টার করুন: রিয়েল-ওয়ার্ল্ড উদাহরণসহ প্র্যাকটিক্যাল গাইড

আপনি এটিও রিকোয়ায়ার করতে পারেন যে পাসওয়ার্ড নির্দিষ্ট ওয়ার্ড কন্টেইন না করে স্ট্রাঙ্গার পাসওয়ার্ড এনফোর্স করতে।

উদাহরণস্বরূপ, আমরা পাসওয়ার্ড রিজেক্ট করতে চাই যদি সেটি pass বা 1234 কন্টেইন করে। নেগেটিভ লুকআহেড এই জবের জন্য টুল। Regex হবে ^(?!.*(pass|1234)).*$।

রেগুলার এক্সপ্রেশন মাস্টার করুন: রিয়েল-ওয়ার্ল্ড উদাহরণসহ প্র্যাকটিক্যাল গাইড

এই regex-এ, আমরা pass এবং 1234 ক্যাপচার গ্রুপের ভিতরে রেখে লজিক্যাল OR অপারেটর ব্যবহার করেছি। এই ক্যাপচার গ্রুপ আরেকটি ক্যাপচার গ্রুপের ভিতরে নেস্টেড যেটি ?!.* প্রিফিক্সড। এটিকে নেগেটিভ লুকআহেড করে যা ম্যাচ করবে যদি কমপক্ষে ৮ ক্যারেক্টার থাকে .{8,} দিয়ে এই শর্তে, pass বা 1234 স্ট্রিং-এর যেকোনো জায়গায় থাকতে পারবে না।

শেষ কথা

আশা করি এই আর্টিকেল পড়ার সময় আপনাকে একটি ভালো পরিমাণ প্র্যাকটিস मिलল। কিছু সিনট্যাক্স ভুলে যাওয়ায় কোই প্রোবলেম নেই। গুরুত্বপূর্ণ হলো কোর কনসেপ্ট বুঝতে এবং regex-এ কী কী সম্ভব সেটি ভালো ধারণা রাখতে। তারপর, আপনি যদি কোনো প্যাটার্ন ভুলে যান, আপনি শুধু গুগল করতে পারেন বা একটি চিটশিট রেফারেন্স করতে পারেন।

আপনি যত বেশি প্র্যাকটিস করবেন, তত বেশি আপনি আউটসাইড হেল্প ছাড়া কাজ चला পারবেন। একদিন আপনি পুরোপুরি অফলাইনেই সুপার কমপ্লেক্স এবং ইফেক্টিভ regex লিখতে পারবেন।

ইতিমধ্যে কিছু ভালো regex চিটশিট আছে, তাই আমি কিছু আরও ইন-ডেপথ তৈরি করতে চেstum ছিল যা আপনি কোর কনসেপ্ট এবং সাধারণ ইউজ কেসের জন্য রেফারেন্স হিসেবে ব্যবহার করতে পারেন।

আপনি যদি চিটশিট খুঁজছেন, QuickRef-এর वाला হেলপফুল। সেটি সিনট্যাক্স রিকাল করার জন্য ভালো জায়গা এবং তারা ভিন্ন প্রোগ্রামিং ল্যাঙ্গুয়েজে regex-রিলেটেড ফাংশনগুলোর বেসিক ওভারভিউও দেয়।

প্রায় সব regex টেকনিক সকল প্রোগ্রামিং ল্যাঙ্গুয়েজ এবং টুলসে একই – কিন্তু নির্দিষ্ট টুল কিছু অ্যাডিশনাল ফিচার অফার করতে পারে। তাই আপনি যে টুলটি ব্যবহার করছেন সেটি সম্পর্কে রিসার্চ করুন সেরা টুল বেছে নেওয়ার জন্য।

আমার চূড়ান্ত পরামর্শ হয় regex শুধু কারণ আপনি পারেন তাই জবরদস্তি ব্যবহার করবেন না। অনেক সময় একটি রেগুলার string.find() কাজ করা যেতে পারে। কিন্তু আপনি যদি টার্মিনালে বাস করেন, আপনি নিঃসন্দেহে regex-এ অনেক কিছু করতে পারবেন।

আপনি যদি এই ধরণের আর্টিকেল পছন্দ করেন, আমার ব্লগ বা টوییটারে চোখ রাখতে পারেন।

নিঃশুল্ক কোডিং শিখুন। freeCodeCamp-এর ওপেন সোর্স কারিকুলাম ৪০,০০০-এর বেশি লোককে ডেভেলপার হিসেবে চাকরি পেতে সাহায্য করেছে। শুরু করুন।

  1. অ্যারে রোটেশনের পাইথন প্রোগ্রাম

  2. SQL Server-এ Truncate vs Delete বোঝা: মূল পার্থক্য এবং ব্যবহারের ক্ষেত্রে

  3. পাইথন Tkinter-এ geometry মেথড

  4. Marcel: লিনাক্সের জন্য একটি আধুনিক, পাইথন-চালিত শেল