পাইথন অ লোভী রেজেক্সেস


150

এর পরিবর্তে অজগর ম্যাচ "(.*)"দেওয়া কীভাবে আমি অজগর রেজেক্স করব ?"a (b) c (d) e""b""b) c (d"

আমি জানি যে এর "[^)]"পরিবর্তে আমি ব্যবহার করতে পারি ".", তবে আমি আরও সাধারণ সমাধানের সন্ধান করছি যা আমার রেজেক্সকে আরও পরিষ্কার রাখে। "হেই, যত তাড়াতাড়ি সম্ভব এটি মেলে" অজগরকে বলার কোনও উপায় আছে কি?

উত্তর:


209

আপনি সর্বশক্তিমানদের সন্ধান করেন *?

দস্তাবেজগুলি থেকে, লোভী বনাম অ লোভী

অ লোভী কোয়ালিফায়ার *?, +?, ??, অথবা {m,n}?[...] যেমন ম্যাচ সামান্য সম্ভব হিসাবে পাঠ্য।


ইন্টারনেট সংরক্ষণাগার অনুসারে, সমস্ত লিঙ্কটি নির্দেশিত ছিল পাইথন "পুনরায়" মডিউল ডক্সের অনুলিপি, সুতরাং ট্রেয়ের লিঙ্কটি ঠিক একইভাবে কাজ করে।
spiffytech

2
এর সাধারণ ইংরেজি নাম *?কী?
ট্রেভর বয়েড স্মিথ

ওয়াইল্ডকার্ডের চরিত্রগুলি @ ট্রেভর বয়ড স্মিথ
সার্জ

3
একে বলা হয় "অ লোভী" যোগ্যতা
ব্রুনেটটন

65
>>> x = "a (b) c (d) e"
>>> re.search(r"\(.*\)", x).group()
'(b) c (d)'
>>> re.search(r"\(.*?\)", x).group()
'(b)'

ডক্স অনুসারে :

' *', ' +' এবং ' ?' বাছাইকারীরা সমস্ত লোভী; তারা যতটা সম্ভব টেক্সট মেলে। কখনও কখনও এই আচরণ পছন্দসই হয় না; আর আর <.*>' <H1>title</H1>' এর বিপরীতে মিলে গেলে এটি পুরো স্ট্রিংয়ের সাথে মিলবে, কেবল ' <H1>' নয়। ?কোয়ালিফায়ারের পরে ' ' যুক্ত করা এটি অ-লোভী বা ন্যূনতম ফ্যাশনে ম্যাচটি সম্পাদন করে; যতটা সম্ভব অক্ষরের সাথে মিল থাকবে। .*?পূর্বের এক্সপ্রেশনটিতে ব্যবহার করা কেবল মিলবে ' <H1>'।


14

\\(.*?\\)কাজ করবে না ? এটি লোভী সিনট্যাক্স synt


5

অন্যরা যেমন ব্যবহার করে বলেছে? * কোয়ানটিফায়ার সংশোধক আপনার তাত্ক্ষণিক সমস্যার সমাধান করবে, তবে সতর্কতা অবলম্বন করুন, আপনি এমন অঞ্চলে বিভ্রান্ত হতে শুরু করেছেন যেখানে রেজিওসরা কাজ করা বন্ধ করে দেয় এবং পরিবর্তে আপনার একটি পার্সার প্রয়োজন। উদাহরণস্বরূপ, "(foo (বার)) বাজ" স্ট্রিং আপনাকে সমস্যার সৃষ্টি করবে।


5

একটি অসম্পূর্ণ ম্যাচ ব্যবহার করা একটি ভাল শুরু, তবে আমি আপনাকে কোনও ব্যবহার .*সম্পর্কে পুনর্বিবেচনা করার পরামর্শ দিচ্ছি - এটি কী?

groups = re.search(r"\([^)]*\)", x)

3

আপনি কি এটি "(খ)" মেলাতে চান? জিট্রিক্স এবং পাওলো যেমন পরামর্শ দিয়েছেন তেমন করুন। আপনি কি এটি "খ" এর সাথে মেলে চান? ডু

>>> x = "a (b) c (d) e"
>>> re.search(r"\((.*?)\)", x).group(1)
'b'

0

শুরু করার জন্য, আমি রেজিজেসগুলিতে "*" ব্যবহার করার পরামর্শ দিই না। হ্যাঁ, আমি জানি, এটি সর্বাধিক ব্যবহৃত বহু-চরিত্রের ডিলিমিটার তবে এটি তবুও একটি খারাপ ধারণা। এটি কারণ, যদিও এটি চরিত্রটির জন্য কোনও পরিমাণ পুনরাবৃত্তির সাথে মেলে, "যে কোনও" এর মধ্যে 0 টি অন্তর্ভুক্ত থাকে, যা সাধারণত এমন কিছু যা আপনি একটি বাক্য গঠন ত্রুটি নিক্ষেপ করতে চান, গ্রহণযোগ্য নয়। পরিবর্তে, আমি +সাইনটি ব্যবহার করার পরামর্শ দিচ্ছি , যা দৈর্ঘ্যের কোনও পুনরাবৃত্তি>> 1 এর সাথে মিলে যায় more আরও কী, আমি যা দেখতে পাচ্ছি তা থেকে আপনি স্থির-দৈর্ঘ্যের প্রথম বন্ধনের মত প্রকাশ করছেন। ফলস্বরূপ, আপনি সম্ভবত {x, y}বিশেষভাবে পছন্দসই দৈর্ঘ্য নির্দিষ্ট করতে সিনট্যাক্সটি ব্যবহার করতে পারেন ।

তবে, যদি আপনার সত্যিই অ-লোভী পুনরাবৃত্তি প্রয়োজন হয় তবে আমি সর্বশক্তিমানের সাথে পরামর্শ করার পরামর্শ দিচ্ছি ?। এটি, যখন কোনও রেগেক্স পুনরাবৃত্তি নির্দিষ্টকারীর শেষে রাখে, তখন রেগেক্সের সেই অংশটিকে ন্যূনতম পরিমাণের পাঠ্য খুঁজে পেতে বাধ্য করা হবে।

বলা হচ্ছে, আমি ?যেমন ডঃ হোন এর সোনিক স্ক্র্যাড্রাইভারের মতো তার সাথে খুব যত্নশীল হব , কীভাবে করার প্রবণতা রয়েছে, আমি কীভাবে এটি যুক্ত করব, সাবধানে ক্যালিব্রেটেড না হলে "সামান্য" অনাকাঙ্ক্ষিত জিনিসগুলি কীভাবে রাখা উচিত। উদাহরণস্বরূপ, আপনার উদাহরণ ইনপুট ব্যবহার করতে, এটি ((1)ম্যাচ হিসাবে চিহ্নিত করবে (দ্বিতীয় আর্পারেনের অভাবটি নোট করুন)।

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