तो मैं एक निश्चित संक्षेप XYZ की सभी घटनाओं से मेल खाने की कोशिश कर रहा हूं, लेकिन केवल तभी जब वे दोनों तरफ कोष्ठक से घिरे हुए न हों। स्ट्रिंग्स XYZ filler text,(XYZ filler text), और (Filler text XYZ) सभी का मिलान होना चाहिए, और स्ट्रिंग (XYZ) का मिलान नहीं होना चाहिए।

मुझे सबसे नज़दीक मिल सकता है

(?<!\()XYZ(?!\))

बेशक इसके साथ समस्या यह है कि यदि दोनों में से कोई भी नकारात्मक अभिकथन मेल खाता है तो पूरी बात मेल नहीं रह जाती है। मुझे इस बारे में कैसे बर्ताव करना चाहिए? धन्यवाद!

2
Padaca 28 जून 2019, 18:22

2 जवाब

सबसे बढ़िया उत्तर

आप या (|) रेगेक्स कर सकते हैं:

(?<!\()XYZ|XYZ(?!\))

उदाहरण:

import re

lst = ['XYZ filler text', '(XYZ filler text)', '(Filler text XYZ)', '(XYZ)']

for x in lst:
    print(re.search(r'(?<!\()XYZ|XYZ(?!\))', x))

जो आउटपुट करता है:

<re.Match object; span=(0, 3), match='XYZ'>
<re.Match object; span=(1, 4), match='XYZ'>      
<re.Match object; span=(13, 16), match='XYZ'>     
None
3
Austin 28 जून 2019, 18:32

मैं रेगेक्स #1 या #2
. का उपयोग करूंगा और रेगेक्स #3 . से बचें

Regex1:   XYZ(?!(?<=\(...(?=\))))
Options:  < none >
Completed iterations:   50  /  50     ( x 1000 )
Matches found per iteration:   9
Elapsed Time:    0.53 s,   531.79 ms,   531788 µs
Matches per sec:   846,201


Regex2:   XYZ(?:(?!\))|(?<!\(...))
Options:  < none >
Completed iterations:   50  /  50     ( x 1000 )
Matches found per iteration:   9
Elapsed Time:    0.53 s,   533.03 ms,   533029 µs
Matches per sec:   844,231


Regex3:   (?<!\()XYZ|XYZ(?!\))
Options:  < none >
Completed iterations:   50  /  50     ( x 1000 )
Matches found per iteration:   9
Elapsed Time:    1.42 s,   1417.15 ms,   1417151 µs
Matches per sec:   317,538
1
user557597user557597 28 अगस्त 2019, 22:47