স্পেশাল সিকুয়েন্স

একটি ব্যাকস্ল্যাশ \ এবং সাথে একটি ক্যারেক্টার ব্যবহার করে রেগুলার এক্সপ্রেশনের জন্য একটি স্পেশাল সিকোয়েন্স তৈরি করা হয়। যেমন, একটি বহুল ব্যবহৃত সিকোয়েন্স হচ্ছে \1 বা \2 বা এরকম। এর মাধ্যমে ওই নাম্বার গ্রুপের (আগের চ্যাপ্টারে গ্রুপ নিয়ে আলোচনা আছে) এক্সপ্রেশনকে ম্যাচ করে দেখা হয়।

উদাহরণ,

import re

pattern = r"(.+) \1"

match = re.match(pattern, "word word")
if match:
    print ("Match 1")

match = re.match(pattern, "?! ?!")
if match:
    print ("Match 2")    

match = re.match(pattern, "abc cde")
if match:
    print ("Match 3")

প্রথম ম্যাচ স্টেটমেন্টটি খেয়াল করি - এখানে (.+) দিয়ে প্রথম গ্রুপে একটি খুশি মত যেকোনো স্ট্রিং চেক করা হচ্ছে আর এর পরেই \1 দিয়ে সেই গ্রুপের (group(1)) জন্য ম্যাচ হওয়া এক্সপ্রেশনকে (word) ম্যাচ করে দেখা হচ্ছে। অর্থাৎ প্রথম অংশে যা থাকবে পরের অংশেও কেবল তাই থাকলেই ম্যাচ সত্য হবে।

আউটপুট,

Match 1
Match 2

তৃতীয় ম্যাচ স্টেটমেন্টের ক্ষেত্রে abc এবং cde এক নয়। তাই এটি মিথ্যা হয়েছে।

\d \s এবং \w

\d দিয়ে ডিজিট, \s দিয়ে হোয়াইট স্পেস এবং \w দিয়ে ওয়ার্ড ক্যারেক্টার ম্যাচ করা হয়ে থাকে। ASCII মুডে এগুলো যথাক্রমে এভাবেও লেখা যায় বা একই এক্সপ্রেশন প্রকাশ করে - [0-9], [ \t\n\r\f\v], and [a-zA-Z0-9_]

মজার বিষয় হচ্ছে এই স্পেশাল সিকোয়েন্স গুলোর বড় হাতের ভার্সন ঠিক উল্টো জিনিষ প্রকাশ করে। অর্থাৎ - \D দিয়ে সব কিছু কিন্তু ডিজিট নয় এমন ম্যাচ করে।

উদাহরণ,

import re

pattern = r"(\D+\d)"

match = re.match(pattern, "Hi 999!")

if match:
    print("Match 1")

match = re.match(pattern, "1, 23, 456!")
if match:
    print("Match 2")

match = re.match(pattern, " ! $?")
if match:
    print("Match 3")

আউটপুট,

Match 1

অর্থাৎ, (\D+\d) দিয়ে এমন একটি স্ট্রিং কে ম্যাচ করার কথা বলা হচ্ছে যার শুরুতে কিছু ক্যারেক্টার থাকবে যেগুলো আর যাই হোক ডিজিট নয়, এবং এরপরে কিছু ডিজিট থাকবে।

আরও কিছু স্পেশাল সিকোয়েন্স

\A এবং \Z দিয়ে কোন স্ট্রিং এর শুরু এবং শেষ ম্যাচ করা হয়। \b দিয়ে ওয়ার্ডের মধ্যেকার বাউন্ডারি বা সীমা গুলোকে চিহ্নিত করা হয়। নিচের উদাহরণটি দেখলে এর ব্যবহার আরও পরিষ্কার বোঝা যাবে।

import re

pattern = r"\b(cat)\b"

match = re.search(pattern, "The cat sat!")
if match:
    print ("Match 1")

match = re.search(pattern, "We s>cat<tered?")
if match:
    print ("Match 2")

match = re.search(pattern, "We scattered.")
if match:
    print ("Match 3")

match = re.search(pattern, "We/cat.tered.")
if match:
    print ("Match 4")    

match = re.search(pattern, "We{cat!tered.")
if match:
    print ("Match 5")

আউটপুট,

Match 1
Match 2
Match 4
Match 5

এখানে \b(cat)\b এর মাধ্যমে cat শব্দটিকে ম্যাচ করা হচ্ছে যাতে এর দুপাশে যেকোনো রকম ওয়ার্ড বাউন্ডারি থাকে। তাহলেই ম্যাচ সত্য হবে।

Last updated