2016-09-25 5 views
6

मैंने अपने कोड को उस विशिष्ट समस्या के लिए सरल बना दिया है जो मेरे पास है।डैश पर शब्द सीमा b नहीं मिलान करें

import re 
pattern = re.compile(r'\bword\b') 
result = pattern.sub(lambda x: "match", "-word- word") 

मैं

'-match- match' 

हो रही है, लेकिन मैं चाहता हूँ

'-word- match' 

संपादित करें:

या स्ट्रिंग के लिए "word -word-"

मैं चाहता हूँ

"match -word-" 

उत्तर

2

\b मूल रूप से [a-zA-Z0-9_] के अलावा वर्णों पर एक शब्द सीमा को दर्शाता है जिसमें रिक्त स्थान भी शामिल हैं। नकारात्मक lookarounds साथ word चारों ओर यह सुनिश्चित करने के बाद कोई गैर अंतरिक्ष चरित्र है और यह पहले:

re.compile(r'(?<!\S)word(?!\S)') 
6

आपको जो चाहिए वह नकारात्मक दिखने वाला है।

(?<!...) से मेल खाता है, तो स्ट्रिंग में वर्तमान स्थिति के लिए ....

तो यह केवल होगा मैच एक मैच से पहले नहीं कर रहा है:

pattern = re.compile(r'(?<!-)\bword\b') 
result = pattern.sub(lambda x: "match", "-word- word") 

documentation का हवाला देते हैं करने के लिए , यदि शब्द-ब्रेक \b एक शून्य चिह्न - से पहले नहीं है।

यदि आपको स्ट्रिंग के अंत के लिए इसकी आवश्यकता है तो आपको नकारात्मक दिखने का उपयोग करना होगा जो इस तरह दिखेगा: (?!-)। इसके बाद पूर्ण नियमित अभिव्यक्ति का परिणाम होगा: (?<!-)\bword(?!-)\b

+0

मैं यह भी सुनिश्चित कैसे कर सकता हूं कि – alpalalpal

+0

शब्द के बाद कोई डैश नहीं है मैंने एक स्पष्टीकरण जोड़ा। – Matthias

0

शब्द सीमाओं के बजाय, आप भी चरित्र से पहले और एक (\s|^) और (\s|$) पैटर्न के साथ शब्द के बाद से मेल खा सकते।

टूटने: \s मैचों हर खाली स्थान के चरित्र है, जो, आप क्या हासिल करने की कोशिश कर रहे हैं हो रहा है के रूप में आप डैश को छोड़कर कर रहे हैं। ^ और $ यह सुनिश्चित करें कि यदि शब्द स्ट्रिंग में पहला या आखिरी है (यानी कोई चरित्र पहले या बाद में नहीं) तो उनसे मिलान भी किया जाता है।

आपका कोड कुछ इस तरह बन जाएगा:

pattern = re.compile(r'(\s|^)(word)(\s|$)') 
result = pattern.sub(r"\1match\3", "-word- word") 

क्योंकि इस समाधान इस तरह के \s के रूप में चरित्र वर्गों का उपयोग करता है, तो इसका मतलब है कि जो आसानी से बदला जा सकता है या बढ़ाया। उदाहरण के लिए यदि आप चाहते थे कि आपके शब्द रिक्त स्थान या अल्पविराम से सीमित हों, तो आपका पैटर्न कुछ ऐसा हो जाएगा: r'(,|\s|^)(word)(,|\s|$)'

संबंधित मुद्दे