पाइथन ३ को लागि पुन मोड्युलको लागि कागजात। नियमित अभिव्यक्तिका लागि पुन: मोड्युल

नियमित अभिव्यक्ति लगभग कुनै पनि प्रोग्रामिङ भाषा को एक धेरै लोकप्रिय घटक हो। तिनीहरूले तपाईंलाई आवश्यक जानकारी छिटो पहुँच गर्न मद्दत गर्दछ। विशेष गरी, तिनीहरू प्रयोग गरिन्छ जब यो पाठ प्रक्रिया गर्न आवश्यक छ। पाइथन पूर्वनिर्धारित रूपमा एक विशेष मोड्युलको साथ आउँछ। re, जो नियमित अभिव्यक्ति संग काम गर्न को लागी जिम्मेवार छ।

आज हामी यो सामान्य रूपमा के हो, तिनीहरूसँग कसरी काम गर्ने र कसरी मोड्युलको बारेमा विस्तृत रूपमा कुरा गर्नेछौं re मद्दत गर्दछ

नियमित अभिव्यक्ति: एक परिचय

नियमित अभिव्यक्तिको प्रयोग के हो? लगभग सबै। उदाहरणका लागि, यी:

  1. वेब अनुप्रयोगहरू जसलाई पाठ प्रमाणीकरण आवश्यक छ। एक विशिष्ट उदाहरण अनलाइन मेल क्लाइन्टहरू हो।
  2. पाठ, डाटाबेस र यति मा सम्बन्धित कुनै पनि अन्य परियोजनाहरू।

हामीले सिन्ट्याक्स पार्स गर्न सुरु गर्नु अघि, हामीले पुस्तकालयको कार्यका आधारभूत सिद्धान्तहरूलाई थप विस्तारमा बुझ्नुपर्छ। re र सामान्यतया, यसको बारेमा सामान्यतया के राम्रो छ। हामी वास्तविक अभ्यासबाट उदाहरणहरू पनि दिनेछौं, जहाँ हामी तिनीहरूको प्रयोगको संयन्त्रको वर्णन गर्नेछौं। तपाईले यस्तो टेम्प्लेट सिर्जना गर्न सक्नुहुन्छ, तपाईलाई पाठसँग विभिन्न प्रकारका कार्यहरू गर्नको लागि उपयुक्त।

Re लाइब्रेरीमा टेम्प्लेट के हो?

यसको साथ, तपाईं अन्य प्रकार्यहरू थप अनुकूली बनाउनको लागि, विभिन्न प्रकारका जानकारी खोज्न सक्नुहुन्छ, तिनीहरूसँग सम्बन्धित जानकारी प्राप्त गर्न सक्नुहुन्छ। र, निस्सन्देह, यो डाटा प्रक्रिया गर्न।

उदाहरणका लागि, निम्न टेम्प्लेट लिनुहोस्: s+। यसको अर्थ कुनै पनि स्पेस क्यारेक्टर हो। यदि तपाइँ यसमा प्लस चिन्ह थप्नुहुन्छ भने, यसको मतलब यो ढाँचामा एक भन्दा बढी ठाउँ समावेश छ। यसले ट्याब क्यारेक्टरहरू पनि मिलाउन सक्छ जुनसँग बोलाइन्छ t+.

तिनीहरूलाई प्रयोग गर्नु अघि, तपाईंले पुस्तकालय आयात गर्न आवश्यक छ Re। त्यस पछि, हामी टेम्प्लेट कम्पाइल गर्न विशेष आदेश प्रयोग गर्दछौं। यो दुई चरणमा गरिन्छ।

>>> पुन: आयात गर्नुहोस्

>>> regex = re.compile('s+')

विशेष रूपमा, यो कोडले प्रयोग गर्न सकिने टेम्प्लेट कम्पाइल गर्ने कार्य गर्दछ। उदाहरणका लागि, खाली ठाउँहरू खोज्न (एक वा बढी)।

नियमित अभिव्यक्ति प्रयोग गरेर विभिन्न स्ट्रिङहरूबाट अलग जानकारी प्राप्त गर्दै

मानौं हामीसँग निम्न जानकारी भएको चर छ।

>>> पाठ = """100 INF सूचना

213 MAT गणित  

156 ENG अंग्रेजी »»»

यसमा तीनवटा प्रशिक्षण पाठ्यक्रमहरू छन्। तिनीहरूमध्ये प्रत्येक तीन भागहरू समावेश गर्दछ - नम्बर, कोड र नाम। हामी देख्छौं कि यी शब्दहरू बीचको अन्तराल फरक छ। यस रेखालाई अलग-अलग संख्या र शब्दहरूमा तोड्न के गर्नुपर्छ? यो लक्ष्य हासिल गर्न दुई तरिकाहरू छन्:

  1. एक प्रकार्य कल गर्नुहोस् पुन: विभाजन.
  2. प्रकार्य लागू गर्नुहोस् विभाजित लागि रेगेक्स.

यहाँ हाम्रो चरको लागि प्रत्येक विधिको सिन्ट्याक्स प्रयोग गर्ने एउटा उदाहरण हो।

>>> re.split('s+', पाठ)  

# वा

>>> regex.split(पाठ)

आउटपुट: ['100', 'INF', 'कम्प्युटर विज्ञान', '213', 'MAT', 'Math', '156', 'ENG', 'English']

सामान्यतया, दुवै विधिहरू प्रयोग गर्न सकिन्छ। तर धेरै पटक प्रकार्य प्रयोग गर्नुको सट्टा नियमित अभिव्यक्ति प्रयोग गर्न यो वास्तवमा धेरै सजिलो छ। पुन: विभाजन.

तीन प्रकार्यहरूसँग मेलहरू खोज्दै

मानौं हामीले स्ट्रिङबाट संख्याहरू मात्र निकाल्न आवश्यक छ। यसका लागि के गर्नुपर्छ ?

re.findall()

यहाँ प्रकार्य को लागी एक प्रयोग मामला छ Findall(), जसले, रेगुलर एक्सप्रेशनको साथमा, तपाइँलाई पाठ चरबाट एक वा बढी संख्याहरूको घटनाहरू निकाल्न अनुमति दिन्छ।

>>> प्रिन्ट (पाठ)  

100 INF सूचना विज्ञान

213 MAT गणित  

156 ENG अंग्रेजी

>>> regex_num = re.compile('d+')  

>>> regex_num.findall(पाठ)  

['१००', '२१३', '१५६']

d प्रतीकको साथमा, हामीले एउटा टेम्प्लेट प्रयोग गर्यौं जसले चर वा पाठमा अवस्थित कुनै पनि संख्यात्मक मानलाई संकेत गर्छ। र हामीले त्यहाँ एउटा + थपेको हुनाले, यसको मतलब कम्तिमा एउटा नम्बर उपस्थित हुनुपर्छ। 

तपाइँले * चिन्ह पनि प्रयोग गर्न सक्नुहुन्छ कि मिलान फेला पार्नको लागि अंकको उपस्थिति आवश्यक छैन।

तर हाम्रो मामला मा, हामीले + प्रयोग गरेपछि, हामीले निकाल्यौं Findall() पाठबाट पाठ्यक्रमहरूको 1 वा बढी डिजिटल पदनामहरू। यसरी, हाम्रो अवस्थामा, नियमित अभिव्यक्तिले प्रकार्यको लागि सेटिङहरूको रूपमा कार्य गर्दछ।

re.search() बनाम re.match()

तपाईंले प्रकार्यहरूको नामबाट अनुमान लगाउन सक्नुहुन्छ, पहिलो पाठमा मेल खोज्छ। प्रश्न: के बीच फरक छ फेला पार्नुहोस्? बिन्दु यो हो कि यसले ढाँचासँग मेल खाने विशिष्ट वस्तु फर्काउँछ, र अघिल्लो प्रकार्य जस्तै सूचीको रूपमा फेला परेका परिणामहरूको सम्पूर्ण अनुक्रम होइन।

बदलामा, re.match प्रकार्यले पनि त्यस्तै गर्छ। केवल वाक्य रचना फरक छ। टेम्प्लेट सुरुमा राखिएको हुनुपर्छ। 

यो देखाउने एउटा उदाहरण लिऔं।

>>> # पाठको साथ एक चर सिर्जना गर्नुहोस्

>>> text2 = «»»INF सूचना

213 MAT गणित 156″»»  

>>> # regex कम्पाइल गर्नुहोस् र ढाँचाहरू खोज्नुहोस्

>>> regex_num = re.compile('d+')  

>>> s = regex_num.search(text2)  

>>> छाप्नुहोस्('पहिलो अनुक्रमणिका:', s.start())  

>>> छाप्नुहोस्('अन्तिम अनुक्रमणिका:', s.end())  

>>> छाप्नुहोस्(text2[s.start():s.end()]) 

पहिलो अनुक्रमणिका: 17 

पछिल्लो अनुक्रमणिका: २०

213

यदि तपाइँ फरक तरिकामा समान परिणाम प्राप्त गर्न चाहनुहुन्छ भने, तपाइँ प्रकार्य प्रयोग गर्न सक्नुहुन्छ समूह().

Re लाइब्रेरीसँग पाठको अंश प्रतिस्थापन गर्दै

पाठ प्रतिस्थापन गर्न, प्रकार्य प्रयोग गर्नुहोस् re.sub()। मानौं हाम्रो पाठ्यक्रमहरूको सूची थोरै परिवर्तन भएको छ। हामी देख्छौं कि प्रत्येक डिजिटल मान पछि हामीसँग ट्याब छ। हाम्रो कार्य भनेको यो सबै क्रमलाई एउटै लाइनमा जोड्नु हो। यो गर्नको लागि, हामीले अभिव्यक्ति s+ प्रतिस्थापन गर्न आवश्यक छ पारित गर्न 

मूल पाठ थियो:

# पाठको साथ एक चर सिर्जना गर्नुहोस्

>>> पाठ = """100 INF t सूचना विज्ञान

213 MAT t गणित  

156 ENG t अंग्रेजी »»»  

>>> प्रिन्ट (पाठ)  

२२ INFO कम्प्यूटर विज्ञान

213 MAT गणित  

००२156 एएनजी अंग्रेजी

वांछित सञ्चालन गर्न, हामीले कोडको निम्न लाइनहरू प्रयोग गर्यौं।

# १ बाट एक वा बढी खाली ठाउँहरू प्रतिस्थापन गर्नुहोस्

>>> regex = re.compile('s+')  

>>> छाप्नुहोस्(regex.sub(' ', पाठ))  

नतिजाको रूपमा, हामीसँग एक लाइन छ। 

101 COM कम्प्युटर 205 MAT गणित 189 ENG अंग्रेजी

अब अर्को समस्या विचार गर्नुहोस्। हामी खाली ठाउँहरू राख्ने कामको सामना गर्दैनौं। यो हाम्रो लागि धेरै महत्त्वपूर्ण छ कि सबै पाठ्यक्रम नामहरू नयाँ लाइनमा सुरु हुन्छ। यो गर्नको लागि, अर्को अभिव्यक्ति प्रयोग गरिन्छ जसले अपवादमा नयाँ लाइन थप्छ। यो कस्तो अभिव्यक्ति हो?

पुस्तकालय Re नकारात्मक मिलान जस्ता सुविधालाई समर्थन गर्दछ। यो प्रत्यक्ष एक भन्दा फरक छ कि यसले स्ल्याश अघि एक विस्मयादिबोधक बिन्दु समावेश गर्दछ। अर्थात्, यदि हामीले newline क्यारेक्टर छोड्न आवश्यक छ भने, हामीले n को सट्टा !n लेख्नुपर्छ।

हामीले निम्न कोड पाउँछौं।

# newline बाहेक सबै खाली ठाउँहरू हटाउनुहोस्  

>>> regex = re.compile('((?!n)s+)')  

>>> छाप्नुहोस्(regex.sub(' ', पाठ))  

100 INF सूचना विज्ञान

213 MAT गणित  

156 ENG अंग्रेजी

नियमित अभिव्यक्ति समूहहरू के हुन्?

रेगुलर एक्स्प्रेशनको समूहको मद्दतले, हामीले चाहेको वस्तुहरू एउटै लाइनमा नभई अलग-अलग तत्वहरूको रूपमा प्राप्त गर्न सक्छौं। 

मानौं हामीले पाठ्यक्रम नम्बर, कोड र नाम एउटै लाइनमा नभई अलग-अलग तत्वहरूको रूपमा प्राप्त गर्न आवश्यक छ। कार्य पूरा गर्न, तपाईंले कोडको अनावश्यक लाइनहरूको ठूलो संख्या लेख्न आवश्यक छ। 

वास्तवमा, कार्य धेरै सरल बनाउन सकिन्छ। तपाईंले सबै प्रविष्टिहरूको लागि टेम्प्लेट कम्पाइल गर्न सक्नुहुन्छ र केवल डाटा निर्दिष्ट गर्नुहोस् जुन तपाईंले कोष्ठकबाट प्राप्त गर्न आवश्यक छ।

त्यहाँ लाइनहरूको धेरै सानो संख्या हुनेछ। 

# पाठ्यक्रम पाठ टेम्प्लेटहरूको समूहहरू सिर्जना गर्नुहोस् र तिनीहरूलाई निकाल्नुहोस्

>>> course_pattern = '([0-9]+)s*([A-ZY]{3})s*([a-zA-ZoY]{4,})'  

>>> re.findall(course_pattern, text)  

[('100', 'INF', 'कम्प्युटर विज्ञान'), ('213', 'MAT', 'Math'), ('156', 'ENG', 'English')]

"लोभी" मिलान को अवधारणा

मानक अनुसार, मिल्दो डाटाको अधिकतम मात्रा निकाल्न नियमित अभिव्यक्तिहरू प्रोग्राम गरिएको छ। र यदि तपाईंलाई धेरै कम चाहिन्छ भने।

एउटा नमूना HTML कोड हेरौं जहाँ हामीले ट्याग प्राप्त गर्न आवश्यक छ।

>>> पाठ = "लोभी नियमित अभिव्यक्ति मिलानको उदाहरण"  

>>> re.findall('', पाठ)  

['लोभी नियमित अभिव्यक्ति मिलानको उदाहरण']

केवल एक ट्याग निकाल्नुको सट्टा, पाइथनले सम्पूर्ण स्ट्रिङ प्राप्त गर्यो। त्यसैले यसलाई लोभी भनिन्छ।

र ट्याग मात्र प्राप्त गर्न के गर्ने? यस अवस्थामा, तपाईंले अल्छी मिलान प्रयोग गर्न आवश्यक छ। यस्तो अभिव्यक्ति निर्दिष्ट गर्न, ढाँचाको अन्त्यमा प्रश्न चिन्ह थपिएको छ।

तपाईंले निम्न कोड र अनुवादकको आउटपुट प्राप्त गर्नुहुनेछ।

>>> re.findall('', पाठ)  

[”,”]

यदि यो केवल पहिलो सामना गरिएको घटना प्राप्त गर्न आवश्यक छ भने, त्यसपछि विधि प्रयोग गरिन्छ खोज ().

पुन: खोज ('', पाठ) समूह()  

"

त्यसपछि मात्र उद्घाटन ट्याग फेला पर्नेछ।

लोकप्रिय अभिव्यक्ति टेम्प्लेटहरू

यहाँ सबैभन्दा सामान्य रूपमा प्रयोग हुने नियमित अभिव्यक्ति ढाँचाहरू समावेश गरिएको तालिका छ।

पाइथन ३ को लागि पुन मोड्युलको लागि कागजात। नियमित अभिव्यक्तिका लागि पुन: मोड्युल

निष्कर्ष

हामीले नियमित अभिव्यक्तिहरूसँग काम गर्ने सबैभन्दा आधारभूत विधिहरू मात्र विचार गरेका छौं। जे भए पनि, तपाईंले देख्नुभएको छ कि तिनीहरू कत्तिको महत्त्वपूर्ण छन्। र यहाँ यसले कुनै फरक पार्दैन कि यो सम्पूर्ण पाठ वा यसको व्यक्तिगत टुक्राहरू पार्स गर्न आवश्यक छ, चाहे यो सामाजिक सञ्जालमा पोस्ट विश्लेषण गर्न वा यसलाई पछि प्रक्रिया गर्न डाटा सङ्कलन गर्न आवश्यक छ। नियमित अभिव्यक्तिहरू यस मामिलामा भरपर्दो सहयोगी हुन्।

तिनीहरूले तपाईंलाई कार्यहरू गर्न अनुमति दिन्छ जस्तै:

  1. डेटाको ढाँचा निर्दिष्ट गर्दै, जस्तै इमेल ठेगाना वा फोन नम्बर।
  2. स्ट्रिङ प्राप्त गर्दै र यसलाई धेरै साना स्ट्रिङहरूमा विभाजन गर्दै।
  3. पाठको साथ विभिन्न कार्यहरू प्रदर्शन गर्नुहोस्, जस्तै खोजी, आवश्यक जानकारी निकाल्ने, वा क्यारेक्टरहरूको अंश बदल्ने।

नियमित अभिव्यक्तिहरूले तपाईंलाई गैर-तुच्छ कार्यहरू गर्न अनुमति दिन्छ। पहिलो नजर मा, यो विज्ञान मास्टर गर्न सजिलो छैन। तर व्यवहारमा, सबै कुरा मानकीकृत छ, त्यसैले यो एक पटक पत्ता लगाउन पर्याप्त छ, जस पछि यो उपकरण पाइथनमा मात्र होइन, तर कुनै अन्य प्रोग्रामिङ भाषामा पनि प्रयोग गर्न सकिन्छ। एक्सेलले पनि डाटा प्रोसेसिङ स्वचालित गर्न नियमित अभिव्यक्तिहरू प्रयोग गर्दछ। त्यसैले यो उपकरण प्रयोग नगर्नु पाप हो।

जवाफ छाड्नुस्