পাইথনে রেগুলার এক্সপ্রেশনে পজিটিভ এবং নেগেটিভ লুকএরাউন্ড
কখনও কখনও এই ধরনের সমস্যার সমাধান করা প্রয়োজন:
স্ট্রিং 'aaa' খুঁজে বের করে এটিকে
'!' দিয়ে প্রতিস্থাপন করুন, কিন্তু শুধুমাত্র যদি
'aaa' এর পরে 'x' থাকে, এবং
'x' কে নিজে প্রতিস্থাপন করবেন না। আমরা যদি
'সরাসরি' সমস্যাটি সমাধান করার চেষ্টা করি,
তাহলে আমাদের কিছু কাজ করবে না:
txt = 'aaax baaa'
res = re.sub('aaax', '!', txt)
print(res) # আউটপুট হবে '! baaa', কিন্তু আমরা চেয়েছিলাম '!x baaa'
লুকএহেড
সমস্যাটি সমাধানের জন্য একটি উপায় প্রয়োজন যা বলে,
যে 'x' কে প্রতিস্থাপন করা উচিত নয়। এটি
বিশেষ বন্ধনী (?= ) ব্যবহার করে করা হয়,
যা শুধু দেখে কিন্তু নিজের সাথে নেয় না।
এই বন্ধনীগুলিকে পজিটিভ লুকএহেড বলা হয়।
পজিটিভ - কারণ 'x'
(আমাদের ক্ষেত্রে) অবশ্যই থাকতে হবে - শুধুমাত্র তখনই
প্রতিস্থাপন ঘটবে।
আসুন আমাদের সমস্যা সমাধানের জন্য এই বন্ধনীগুলি প্রয়োগ করি:
txt = 'aaax baaa'
res = re.sub('aaa(?=x)', '!', txt)
print(res) # আউটপুট হবে '!x aaab
নেগেটিভ লুকএহেড ও আছে
- (?! ) - এটি, বিপরীতভাবে, বলে
যে কিছু থাকা উচিত নয়। নিম্নলিখিত
উদাহরণে, প্রতিস্থাপন ঘটবে শুধুমাত্র যদি
'aaa' এর পরে 'x' না থাকে:
txt = 'aaax aaab'
res = re.sub('aaa(?!x)', '!', txt)
print(res) # আউটপুট হবে 'aaax !b'
লুকবিহাইন্ড
একইভাবে পজিটিভ
লুকবিহাইন্ড আছে - (?<= )।
নিম্নলিখিত উদাহরণে প্রতিস্থাপন ঘটবে শুধুমাত্র
যদি 'aaa' এর আগে 'x' থাকে:
txt = 'xaaa'
res = re.sub('(?<=x)aaa', '!', txt)
print(res) # আউটপুট হবে 'x!'
এবং নেগেটিভ লুকবিহাইন্ড ও আছে
- (?<! )। নিম্নলিখিত উদাহরণে
প্রতিস্থাপন ঘটবে শুধুমাত্র যদি
'aaa' এর আগে 'x' না থাকে:
txt = 'baaa'
res = re.sub('(?<!x)aaa', '!', txt)
print(res) # আউটপুট হবে 'b!'
ব্যবহারিক সমস্যা
একটি স্ট্রিং দেওয়া হয়েছে, যাতে ফাংশনের নাম রয়েছে:
txt = 'func1() func2() func3()'
স্ট্রিং থেকে ফাংশনের নামগুলির একটি অ্যারে পান।
একটি ট্যাগ সহ একটি স্ট্রিং দেওয়া হয়েছে:
txt = '<a href="" class="eee" id="zzz">'
এই ট্যাগের অ্যাট্রিবিউটের নামগুলির একটি অ্যারে পান।
ভেরিয়েবল সহ একটি স্ট্রিং দেওয়া হয়েছে:
txt = '$aaa $bbb $ccc xxxx'
সেই সাবস্ট্রিংগুলি পান যার আগে ডলার চিহ্ন রয়েছে।