পুনরায় মডিউল সমর্থন শব্দ সীমানা থেকে নিয়মিত প্রকাশ (\ বি)?


102

নিয়মিত অভিব্যক্তি সম্পর্কে আরও কিছুটা জানার চেষ্টা করার সময়, একটি টিউটোরিয়াল সুপারিশ করেছিল যে আপনি \bএকটি শব্দের সীমানা মেলাতে ব্যবহার করতে পারেন । তবে পাইথন ইন্টারপ্রেটারের নিম্নলিখিত স্নিপেট প্রত্যাশার মতো কাজ করে না:

>>> x = 'one two three'
>>> y = re.search("\btwo\b", x)

কোনও কিছুর সাথে মিলে গেলে এটি ম্যাচের বস্তু হওয়া উচিত ছিল, তবে এটি None

\bপাইথনে কি অভিব্যক্তি সমর্থিত নয় বা আমি এটি ভুল ব্যবহার করছি?


31
এটি কাজ করবে:re.search(r"\btwo\b", x)
বলো

4
আপনি "কাঁচা" স্ট্রিং ব্যবহার করছেন না কেন? r"\btwo\b"?
এস .লট

4
মানুষ প্রায়ই বিভ্রান্ত সম্পর্কে \b
tchrist

হ্যাঁ পাইথন এটি করেছে, আপনার কেবল কাঁচা স্ট্রিং দরকার r'\b'তাই চরিত্রটি পালাতে পারে। (বা অন্যথায় এটি ডাবল-পলায়ন \\b, যা ইউক্কি)
স্মি

উত্তর:


86

আপনি চেষ্টা করবেন না কেন

word = 'two'
re.compile(r'\b%s\b' % word, re.I)

আউটপুট:

>>> word = 'two'
>>> k = re.compile(r'\b%s\b' % word, re.I)
>>> x = 'one two three'
>>> y = k.search( x)
>>> y
<_sre.SRE_Match object at 0x100418850>

উল্লেখ করতে ভুলে গেছেন, আপনার কোডে কাঁচা স্ট্রিং ব্যবহার করা উচিত

>>> x = 'one two three'
>>> y = re.search(r"\btwo\b", x)
>>> y
<_sre.SRE_Match object at 0x100418a58>
>>> 

আকর্ষণীয়, কাজের উদাহরণের জন্য ধন্যবাদ। আমি যে পদ্ধতিটি বেছে নিয়েছি তা কেন কাজ করে না সে সম্পর্কে আপনার কী অন্তর্দৃষ্টি আছে? দুটি পদ্ধতির ক্ষেত্রে একই হওয়া উচিত, আপনার পদ্ধতির ব্যতীত আপনি কেবল একবারই সংকলন করছেন।
ডিসি

4
@ আদরেন: আমার শেষ উদাহরণটি দেখুন যা আপনি যা করেছেন তার থেকে কেবল উন্নতি হয়। আমি অনুসন্ধানে কাঁচা স্ট্রিং সরবরাহ করেছি।
pyfunc

4
আহ আপনার এবং বলোর পরামর্শের পরে, কারণ আমি কোনও কাঁচা স্ট্রিং ব্যবহার করছিলাম না। ধন্যবাদ!
ডিসি

9
-1: পিছনে। কাঁচা স্ট্রিং প্রথম হওয়া উচিত। স্ট্রিং %প্রতিস্থাপনের সাথে পুনরায় অভিব্যক্তি তৈরির অন্যান্য ব্যবসাটি একটি খারাপ স্পর্শকাতর, এই নির্দিষ্ট প্রশ্নের সাথে অপ্রাসঙ্গিক।
এস .লট

4
খারাপ উত্তর। কোডটি কাজ করে, তবে এর কোনও ব্যাখ্যা নেই।
অরণ-ফে

89

এটি কাজ করবে: re.search(r"\btwo\b", x)

যখন আপনি লিখতে "\b"পাইথন, এটা একটি একক চরিত্র: "\x08"। হয় এইভাবে ব্যাকস্ল্যাশ এড়িয়ে চলুন:

"\\b"

বা এর মতো একটি কাঁচা স্ট্রিং লিখুন:

r"\b"

4
এটি সত্যই আমাকে সাহায্য করেছিল ... আমি পিস্তর্ক জাতীয় মত নিয়মিত প্রকাশের সাথে লড়াই করে যাচ্ছিলাম এবং বুঝতে পারছিলাম না কেন \ বি (শব্দ সীমানা) কাজ করছে না। ধন্যবাদ
jb1t

18

কেন স্পষ্টভাবে ব্যাখ্যা করতেre.search("\btwo\b", x) পারে না কেন কাজ করে না, কারণ \bপাইথন স্ট্রিংয়ে ব্যাকস্পেসের চরিত্রের সংক্ষিপ্তকরণ।

print("foo\bbar")
fobar

সুতরাং প্যাটার্নটি "\btwo\b"একটি ব্যাকস্পেসের সন্ধান করছে two, তারপরে এবং অন্য ব্যাকস্পেসের পরে, যা আপনি অনুসন্ধান করছেন তার স্ট্রিংটি ( x = 'one two three') নেই।

অনুমতি দিতে re.search(অথবা compile) ক্রম ব্যাখ্যা করা \bএকটি শব্দ সীমানা হিসাবে, হয় ব্যাকস্ল্যাশ (অব্যাহতি "\\btwo\\b") অথবা একটি কাঁচা স্ট্রিং ব্যবহার আপনার প্যাটার্ন তৈরি করতে ( r"\btwo\b")।


10

পাইথন ডকুমেন্টেশন

https://docs.python.org/2/library/re.html#regular-expression-syntax

\ খ

খালি স্ট্রিংয়ের সাথে মেলে তবে কেবল কোনও শব্দের শুরু বা শেষে। একটি শব্দ বর্ণানুক্রমিক বা আন্ডারস্কোর অক্ষরের অনুক্রম হিসাবে সংজ্ঞায়িত করা হয়, সুতরাং শব্দের শেষটি শ্বেত স্পেস বা একটি অ-আলফানিউমারিক, নন-আন্ডারস্কোর অক্ষর দ্বারা নির্দেশিত। নোট করুন যে আনুষ্ঠানিকভাবে, \ b একটি \ w এবং a \ ডাব্লু অক্ষরের (বা তদ্বিপরীত), বা \ w এবং স্ট্রিংয়ের শুরু / শেষের মধ্যে সীমানা হিসাবে সংজ্ঞায়িত হয়েছে, সুতরাং বর্ণমালার যথাযথ সেটটি বর্ণানুক্রমিক বলে মনে করা হয় ইউনিকোড এবং লোকল পতাকাগুলির মানগুলিতে। উদাহরণস্বরূপ, r 'f bfoo \ b' মিলছে 'foo', 'foo।', '(Foo)', 'বার ফু বাজ' তবে 'foobar' বা 'foo3' নয়। একটি অক্ষরের ব্যাপ্তির ভিতরে, পাইথনের স্ট্রিং লিটারালগুলির সাথে সামঞ্জস্যের জন্য \ b ব্যাকস্পেস অক্ষরকে উপস্থাপন করে।

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