2025, Oct 31 05:01
Regex में negative lookbehind से चौथी पोज़िशन वाला ABC कैसे हटाएँ
Regex में negative lookbehind से ABC को चौथी पोज़िशन पर मैच होने से रोकें: (?<!^.{3})ABC. सरल समझ, Python उदाहरण और व्यावहारिक टिप्स. कोड डेमो सहित, विस्तृत
Regex में किसी खास स्थान को मैच से बाहर रखना पेचीदा लग सकता है, जब तक आप नहीं समझते कि lookarounds आपको यह व्यक्त करने देते हैं: “इसे मिलाओ, बस ठीक इसी जगह होने पर नहीं।” काम सरल है: स्ट्रिंग में ABC के हर occurrence को ढूँढो, सिवाय उस स्थिति के जब वह चौथे अक्षर से शुरू हो।
हमें किससे बचना है
अधिकांश स्थानों पर ABC मैच होना चाहिए, बस तब नहीं जब उसका शुरुआती इंडेक्स स्ट्रिंग का चौथा अक्षर हो। यानी FGHABCDE जैसे रूपों को बाहर रखना है, जबकि ABCDEFGH, HABCDEFG, GHABCDEF और EFGHABCD मैच होने चाहिए।
सीधा तरीका: सब कुछ मैच हो जाता है
ABC की साधारण खोज हर occurrence उठा लेगी—चौथी पोज़िशन वाला अनचाहा मैच भी। समस्या यहीं साफ दिखती है:
import re
samples = [
    "ABCDEFGH",
    "HABCDEFG",
    "GHABCDEF",
    "FGHABCDE",
    "EFGHABCD"
]
plain = re.compile(r"ABC")
for text in samples:
    print(text, bool(plain.search(text)))
जैसा उम्मीद थी, इस तरीके में इस बात पर कोई नियंत्रण नहीं कि मैच कहाँ होना अनुमत है।
ऐसा क्यों होता है
Regex इंजन जहाँ भी शाब्दिक पैटर्न दिखे, उसे बेझिझक मिला देते हैं। किसी खास इंडेक्स को बाहर रखने के लिए पैटर्न को अपने आस-पास के संदर्भ की जानकारी चाहिए। यहाँ negative lookbehind मदद करता है: यह बिना कोई अक्षर खाए यह assert करता है कि मौजूदा स्थिति के ठीक पहले कोई शर्त सच नहीं है।
समाधान: स्थिति-सजग negative lookbehind
पैटर्न (?<!^.{3})ABC नियम को सटीक तरह से व्यक्त करता है: “ABC को मिलाओ, बशर्ते वह स्ट्रिंग की शुरुआत से ठीक तीन अक्षरों के बाद न हो।” यहाँ ^.{3} शुरुआत पर एंकर होकर तीन अक्षर मिलाता है; negative lookbehind (?<!...) यह सुनिश्चित करता है कि ABC से ठीक पहले यही संदर्भ मौजूद न हो। नतीजा: चौथी पोज़िशन वाला occurrence बाहर रहता है, बाकी जगहों पर मिलान स्वीकार्य है।
import re
items = [
    "ABCDEFGH",
    "HABCDEFG",
    "GHABCDEF",
    "FGHABCDE",
    "EFGHABCD"
]
rx = re.compile(r"(?<!^.{3})ABC")
for row in items:
    print(row, bool(re.search(rx, row)))
यह ठीक वैसा ही व्यवहार देता है जैसा चाहिए: सब कुछ मैच होता है, सिवाय उस केस के जब ABC चौथे अक्षर से शुरू होता है।
यह क्यों मायने रखता है
कभी-कभी आपको सारे वैध मैच संभालकर रखने होते हैं, लेकिन किसी बिल्कुल तय स्थिति या संदर्भ को छोड़कर। एंकर किए गए उप-पैटर्न के साथ negative lookbehind उस नियम को सीधे regex में संक्षेप और सटीक रूप से अभिव्यक्त कर देता है। यह खासकर तब उपयोगी है जब लक्ष्य “सब कुछ regex में ही” करना हो, ताकि बाहर अतिरिक्त फ़िल्टरिंग लॉजिक न लिखना पड़े।
मुख्य बातें
यदि आपको किसी पैटर्न को हर जगह अनुमति देनी है, बस एक निश्चित शुरुआती इंडेक्स पर नहीं, तो शुरुआत पर एंकर किए negative lookbehind का उपयोग करें और जितने अक्षर निषिद्ध हैं उतने गिन लें। “चौथी पोज़िशन को छोड़कर बाकी सब” के लिए (?<!^.{3})ABC संक्षिप्त और भरोसेमंद विकल्प है। पार्सिंग, वैलिडेशन या टेक्स्ट प्रोसेसिंग में जब भी positional exclusion की ज़रूरत पड़े, इस तकनीक को अपने टूलकिट में रखें।
यह लेख StackOverflow पर प्रश्न (लेखक: Branden Keck) और ruohola के उत्तर पर आधारित है।