পাইথন রেজেক্স তাত্ক্ষণিকভাবে গ্রুপগুলি প্রতিস্থাপন করে


116

রেগেক্স সিনট্যাক্স ব্যবহার করে সমস্ত গ্রুপকে সরাসরি প্রতিস্থাপনের কোনও উপায় আছে কি?

সাধারণ উপায়:

re.match(r"(?:aaa)(_bbb)", string1).group(1)

তবে আমি এরকম কিছু অর্জন করতে চাই:

re.match(r"(\d.*?)\s(\d.*?)", "(CALL_GROUP_1) (CALL_GROUP_2)")

আমি রেগেক্স সবেমাত্র করা গ্রুপগুলি থেকে তাত্ক্ষণিকভাবে নতুন স্ট্রিং তৈরি করতে চাই।

উত্তর:


203

একবার দেখুন re.sub:

result = re.sub(r"(\d.*?)\s(\d.*?)", r"\1 \2", string1)

এটি পাইথনের রেজেক্স সাবস্টিটিউশন (প্রতিস্থাপন) ফাংশন। প্রতিস্থাপনের স্ট্রিং তথাকথিত ব্যাকরিফারেন্সগুলি (ব্যাকস্ল্যাশ, গ্রুপ নম্বর) দিয়ে পূর্ণ হতে পারে যা গ্রুপগুলির সাথে মিলে যায় তার সাথে প্রতিস্থাপিত হয়। গোষ্ঠীগুলি group(...)ফাংশন হিসাবে সমান গণনা করা হয় , অর্থাত্ 1বাম থেকে ডানে, প্রথম বন্ধনী খোলার মাধ্যমে starting


4
ডকের চেয়ে আরও স্পষ্ট উপায়! গ্রুপ কীভাবে এটির সাথে কাজ করছে তা বুঝতে পারেনি। তাদের এ জাতীয় উদাহরণ যুক্ত করা উচিত।
Y0da

এটি প্রথম থেকেই কাজ করেছিল, এটির ব্যাখ্যা দেওয়ার এটি বেশ সুন্দর একটি পরিষ্কার উপায়। ধন্যবাদ এবং আপনি কীভাবে (r(r))r((r)((r)r))উপদলটিকে যথাযথ পরিস্থিতিতে কল করতে হবে তা ব্যাখ্যা করতে পারেন ?
রক্ষিতা মুরঙ্গা রদ্রিগো

4
টুইটগুলি সুতরাং যদি আমি গ্রুপ সামনে প্রতিটি গ্রুপ নম্বর ডানদিকে ঢোকান, তারা সাজানো চাই: 1(r2(r))r3(4(r)5(6(r)r))
মার্টিন এন্ডার

35

গৃহীত উত্তরটি নিখুঁত। আমি যুক্ত করব যে এই বাক্য গঠনটি ব্যবহার করে এই গ্রুপের রেফারেন্স সম্ভবত আরও ভালভাবে অর্জিত হয়েছে:

r"\g<1> \g<2>"

প্রতিস্থাপন স্ট্রিং জন্য। এই পদ্ধতিতে, আপনি সিনট্যাক্স সীমাবদ্ধতার আশেপাশে কাজ করেন যেখানে কোনও গোষ্ঠী একটি ডিজিট অনুসরণ করতে পারে। আবার ডকটিতে এটি উপস্থিত রয়েছে, নতুন কিছু নয়, কেবল কখনও কখনও প্রথম দর্শনে সন্ধান করা কঠিন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.