3 पॉइंट द्वारा GN⁺ 2024-03-21 | 1 टिप्पणियां | WhatsApp पर शेयर करें

Python रेगुलर एक्सप्रेशन में "$" कैरेक्टर के व्यवहार को समझना

  • Python के re मॉड्यूल का उपयोग करते समय आम तौर पर माना जाता है कि ^ का मतलब "string की शुरुआत" होता है और $ का मतलब "string का अंत" होता है।
  • लेकिन $ हमेशा सिर्फ "string का अंत" नहीं बताता, और इसका व्यवहार platform के अनुसार अलग हो सकता है।
  • Python में जब multiline mode निष्क्रिय होता है, तब $ कैरेक्टर string के अंत पर या string के अंत में मौजूद newline कैरेक्टर से ठीक पहले match कर सकता है।

string के अंत और newline कैरेक्टर match होने के बीच का अंतर

  • multiline mode बंद होने पर Python में बिना newline कैरेक्टर के string के अंत से match कराने के लिए केवल $ का उपयोग पर्याप्त नहीं है।
  • string के अंत से match कराने के लिए \z और \Z का उपयोग किया जा सकता है।
  • Python में re.MULTILINE का उपयोग करने पर $ string के अंत और हर पंक्ति के अंत पर, यानी newline कैरेक्टर से ठीक पहले, match करता है।

अलग-अलग platforms पर रेगुलर एक्सप्रेशन के व्यवहार की तुलना

  • कई platforms पर "cat\n" के लिए pattern matching की तुलना करने वाली तालिका से पता चलता है कि अगर newline कैरेक्टर सहित match करने की अनुमति हो, तो multiline mode में $ का उपयोग लगातार एक जैसा व्यवहार देता है।
  • अगर newline कैरेक्टर को शामिल किए बिना match करना हो, तो Python और ECMAScript को छोड़कर सभी platforms पर \z का उपयोग करना चाहिए, और Python तथा ECMAScript में क्रमशः \Z या multiline mode के बिना $ का उपयोग करना चाहिए।

GN⁺ की राय

  • यह लेख रेगुलर एक्सप्रेशन का उपयोग करने वाले डेवलपर्स को Python में $ कैरेक्टर के अप्रत्याशित व्यवहार के प्रति सतर्क कर सकता है।
  • रेगुलर एक्सप्रेशन string processing में बहुत शक्तिशाली हैं, लेकिन अलग-अलग platforms पर इनका व्यवहार बदल सकता है, इसलिए सावधानी जरूरी है।
  • डेवलपर्स को इन अंतरों के बारे में जागरूक रहना चाहिए और cross-platform applications बनाते समय compatibility समस्याओं से बचने के लिए अतिरिक्त testing करनी चाहिए।
  • समान सुविधाएँ देने वाली दूसरी रेगुलर एक्सप्रेशन libraries में Java की java.util.regex और .NET की System.Text.RegularExpressions शामिल हैं; इन्हें भी उनके platform के अनुसार व्यवहार के अंतर समझकर उपयोग करना चाहिए।
  • नए रेगुलर एक्सप्रेशन syntax या व्यवहार को अपनाते समय मौजूदा code के साथ compatibility, performance पर प्रभाव, और टीम के भीतर learning curve को ध्यान में रखना चाहिए, तथा ऐसे बदलावों के लाभ और लागत का सावधानी से मूल्यांकन करना चाहिए।

1 टिप्पणियां

 
GN⁺ 2024-03-21
Hacker News की राय
  • जो लोग regular expressions से परिचित हैं, वे जानते हैं कि ^ का मतलब "string की शुरुआत" और $ का मतलब "string का अंत" होता है। लेकिन मैं व्यक्तिगत रूप से इन्हें "line की शुरुआत" और "line का अंत" मानकर सोचता हूँ। ज़्यादातर मामलों में हम text को एक-एक line के रूप में संभालते हैं, इसलिए नतीजा एक जैसा होता है, लेकिन इन operators के बारे में सोचने का नज़रिया नहीं बदलता। शायद इसलिए कि मेरा regular expressions से पहला परिचय grep के ज़रिए हुआ था और मैं इनपुट को मुख्य रूप से "lines" के रूप में सोचता हूँ.

    • POSIX regular expressions और Python regular expressions अलग हैं। आम तौर पर आपको उसी implementation के regular expression docs देखने चाहिए जिसे आप इस्तेमाल कर रहे हैं, क्योंकि syntax सार्वभौमिक नहीं है.
    • POSIX Chapter 9 के अनुसार, regular expressions आम तौर पर text processing से जुड़े होते हैं और NUL पर समाप्त होने वाली strings पर काम करते हैं, जो string के अंत को दर्शाती है। कुछ utilities processing को lines तक सीमित कर देती हैं। $ string के अंत या line के अंत, दोनों में से किसी एक का मतलब हो सकता है, और यह utility (या mode) पर निर्भर करता है। ज़्यादातर सामान्य utilities (grep, sed, awk, Python आदि) इसे default रूप से line के अंत के रूप में मानती हैं.
    • कोई एक सार्वभौमिक regular expression syntax नहीं है। जब तक आपको इस्तेमाल की जा रही language और options का पता न हो, आप regular expressions को भरोसेमंद तरीके से पढ़ या लिख नहीं सकते.
  • Robert Elder का परिचय कराने का यह एकदम सही मौका है। वह YouTube और blog content बनाते हैं, regular expressions पर उनकी एक series है, और अलग-अलग tools के व्यवहार में मौजूद फ़र्क को गहराई से समझाते हैं.

    • उनका हालिया content भी शानदार है: https://www.youtube.com/watch?v=ys7yUyyQA-Y
    • उनके पास बहुत सारा ऐसा content है जिसमें HN users की दिलचस्पी हो सकती है, जैसे consulting की हक़ीक़त और उसकी मुश्किलें.
  • जब मैंने पहली बार Perl सीखी थी, तो regular expressions उन पहली चीज़ों में से थीं जिन्हें मैंने सच में गहराई से आत्मसात किया। (Perl अब भी "Camel" किताब की वजह से मेरे दिल में एक गर्मजोशी भरी जगह रखती है)

    • आज सबसे महत्वपूर्ण बात यह जानना है कि implementations अलग-अलग होती हैं, और जिस चीज़ पर आप काम कर रहे हैं उसके reference material को तुरंत खोलने की आदत डालनी चाहिए.
    • उदाहरण के लिए, Emacs regular expressions में character class के लिए "\w" की जगह "\s_-" (या reference देखे बिना स्क्रीन पर जो कुछ याद आए) इस्तेमाल होता है, लेकिन Emacs के पास बेहतरीन documentation और discoverability है.
    • कुछ utilities में parentheses को escape करना पड़ता है और कुछ में नहीं। कभी-कभी यह behavior configurable होता है और कभी-कभी नहीं.
    • मैं भ्रम, झुंझलाहट और इनकार—इन सभी चरणों से गुज़र चुका हूँ, और अब बस इसे स्वीकार कर लिया है। concept हर जगह एक जैसा है, लेकिन उसका flavor बदलता रहता है.
  • मैं सुन सकता हूँ कि ख़राब hiring managers अपने "हा! तुम्हें यह चाल नहीं पता!" वाले सवालों की सूची में यह भी जोड़ रहे हैं: 'regular expressions में string के अंत को कैसे match करते हैं?'

  • regular expressions के संदर्भ में Perl को सूची से बाहर रखना अजीब है.

    • perlre docs में $ का विवरण: string के अंत से match करता है (या string के अंत में मौजूद newline character से पहले; या /m का उपयोग करने पर हर newline से पहले)
  • Raku (पहले Perl 6) ने string की शुरुआत और अंत को दिखाने के लिए ^ और $ चुना, और line की शुरुआत और अंत के लिए ^^ और $$ पेश किए। इसमें multiline mode या तो उपलब्ध नहीं है या ज़रूरी नहीं है.

    • पूरी तरह से फिर से सोचने/लिखने का एक फ़ायदा यह है कि आप इस बात से सीख सकते हैं कि पहले का behavior लोगों को चौंकाता था.
  • क्या कोई सच में सोचता है कि regular expressions standardize हो चुकी हैं? किसी नए context में जाना हमेशा दोबारा सीखने जैसा होता है.

  • string और line को लेकर भ्रम है। string characters का एक क्रम है, और line दो अलग चीज़ों में से एक हो सकती है। अगर newline character को line terminator माना जाए, तो line non-newline characters का वह क्रम है जिसमें newline character शामिल हो। अगर newline नहीं है, तो वह पूरी line नहीं है। POSIX यही अपनाता है। अगर newline character को line separator माना जाए, तो line non-newline characters का एक क्रम है। किसी भी स्थिति में, line की content newline character से पहले समाप्त होती है, क्योंकि newline या तो line को समाप्त करती है या उसे अगली line से अलग करती है.

    • ^ और $ का अर्थ line-आधारित है — चाहे single-line mode हो या multi-line mode। string-आधारित अर्थ के लिए — फ़ाइलों के मामले में आप पूरी फ़ाइल को एक string मान सकते हैं — \A और \Z या उनके समकक्ष इस्तेमाल किए जाते हैं.
  • इससे Ruby-आधारित apps में कुछ गंभीर bugs पैदा हुए। मैं हमेशा \A\z इस्तेमाल करता हूँ.