पुनः मॉड्यूल समर्थन शब्द सीमा (\ b) से नियमित अभिव्यक्ति करते हैं?


100

नियमित अभिव्यक्तियों के बारे में थोड़ा और जानने की कोशिश करते हुए, एक ट्यूटोरियल ने सुझाव दिया कि आप \bशब्द सीमा का मिलान करने के लिए शब्द का उपयोग कर सकते हैं । हालाँकि, पायथन इंटरप्रिटर में निम्नलिखित स्निपेट अपेक्षा के अनुरूप काम नहीं करता है:

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

यदि कुछ भी मिलान किया गया था तो यह एक मैच ऑब्जेक्ट होना चाहिए था, लेकिन यह है None

क्या \bपायथन में अभिव्यक्ति का समर्थन नहीं किया गया है या क्या मैं इसका गलत उपयोग कर रहा हूं?


31
यह काम करेगा:re.search(r"\btwo\b", x)
बोलो

5
आप "कच्चे" तार का उपयोग क्यों नहीं कर रहे हैं? r"\btwo\b"?
एस.लॉट


हाँ पायथन करता है, आपको बस कच्चे-स्ट्रिंग की आवश्यकता है r'\b'ताकि चरित्र बच जाए। (या फिर इसे डबल-एस्केप करें \\b, जो कि yukky है)
smci

जवाबों:


85

आप कोशिश क्यों नहीं करते

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>
>>> 

दिलचस्प है, काम करने वाले उदाहरण के लिए धन्यवाद। क्या आपके पास कोई अंतर्दृष्टि है कि मैंने जिस पद्धति को चुना है वह काम क्यों नहीं करता है? दो दृष्टिकोण समान होने चाहिए, सिवाय इसके कि आपके दृष्टिकोण में आप केवल एक बार संकलन कर रहे हैं।
डीसी

1
@ डारेन: मेरे अंतिम उदाहरण को देखें जो आपने जो किया उस पर सुधार करता है। मैंने खोज के लिए कच्चे तार प्रदान किए।
pyfunc

1
तुम्हारे और बोलो के सुझाव के बाद आह, यह इसलिए था क्योंकि मैं एक कच्चे तार का उपयोग नहीं कर रहा था। धन्यवाद!
डीसी

9
-1: पीछे की तरफ। कच्चे तार पहले होने चाहिए। स्ट्रिंग %प्रतिस्थापन के साथ एक पुनः अभिव्यक्ति के निर्माण का अन्य व्यवसाय इस विशेष प्रश्न के लिए एक खराब स्पर्शरेखा, अप्रासंगिक है।
S.Lott

2
बुरा जवाब। कोड काम करता है, लेकिन कोई स्पष्टीकरण नहीं है।
अरण-फे

88

यह काम करेगा: re.search(r"\btwo\b", x)

जब आप "\b"पायथन में लिखते हैं , यह एक एकल चरित्र है "\x08":। या तो इस तरह बैकस्लैश से बच जाएं:

"\\b"

या इस तरह एक कच्ची स्ट्रिंग लिखें:

r"\b"

4
यह वास्तव में मेरी मदद करता था ... मैं एक pyspark नियमित अभिव्यक्ति के समान संघर्ष कर रहा था और यह पता नहीं लगा सका कि क्यों \ b (शब्द सीमा) काम नहीं कर रही थी। धन्यवाद
jb1t

17

बस स्पष्ट रूप से समझाने के लिए कि क्यों 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

खाली स्ट्रिंग से मेल खाता है, लेकिन केवल एक शब्द की शुरुआत या अंत में। किसी शब्द को अल्फ़ान्यूमेरिक या अंडरस्कोर वर्णों के अनुक्रम के रूप में परिभाषित किया जाता है, इसलिए किसी शब्द के अंत को व्हॉट्सएप या एक गैर-अल्फ़ान्यूमेरिक, गैर-अंडरस्कोर वर्ण द्वारा इंगित किया जाता है। ध्यान दें कि औपचारिक रूप से, \ b को \ w और a \ W वर्ण (या इसके विपरीत), या \ w और स्ट्रिंग के आरंभ / अंत के बीच की सीमा के रूप में परिभाषित किया जाता है, इसलिए अल्फ़ान्यूमेरिक समझे जाने वाले वर्णों का सटीक सेट निर्भर करता है UNICODE और LOCALE झंडे के मूल्यों पर। उदाहरण के लिए, r '\ bfoo \ b' 'फू', 'फू', '(फू)', 'बार फू बाज' लेकिन 'फोबार' या 'फू 3' से मेल नहीं खाता। एक वर्ण सीमा के अंदर, पायथन के स्ट्रिंग शाब्दिकों के साथ संगतता के लिए \ b बैकस्पेस वर्ण का प्रतिनिधित्व करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.