/ / देश के नाम के लिए पाठ खोजने के लिए रेगेक्स का उपयोग करना, साथ और बिना रिक्त स्थान - अजगर, रेगेक्स

देश के नामों के साथ और बिना रिक्त स्थान के टेक्स्ट खोजने के लिए रेगेक्स का उपयोग करना - पायथन, रेगेक्स

मैं एक रेगेक्स एक्सप्रेशन का उपयोग कर रहा हूंपाठ के भीतर सभी देश के नाम खोजने के लिए पाठ का ब्लॉक। हालाँकि एक देश के नाम में स्थान हो सकता है, इसलिए उदाहरण के लिए इंग्लैंड यूनाइटेड किंगडम, ग्रेट ब्रिटेन, यूके या जीबी हो सकता है।

अब तक जो प्रक्रिया मैं अभी तक फॉलो कर रहा हूं वह है;

1) सबसे पहले उन सभी शब्दों को खत्म करें जो एक बड़े अक्षर से शुरू नहीं होते हैं।

2) इसके बाद सभी लोअरकेस अक्षरों की खोज करें

मैंने इसके लिए एक मूल अभिव्यक्ति बनाई;

[A-Z][a-z]+

यह एक नाम के लिए एक शब्द के साथ देशों के लिए काम किया।

हालाँकि जैसा कि मैं इसमें एक से अधिक शब्दों के साथ देश के नाम पर कब्जा करने में सक्षम होना चाहता हूं। मैंने तब एक पाइप ऑपरेटर का इस्तेमाल किया, जो कई समूहों से मेल खाने में सक्षम था (!)

प्रक्रिया अब है;

1) रेगेक्स एक्सप्रेशन को केवल पहले अक्षर के लिए बड़े अक्षर से शुरू करने वाले शब्दों के लिए सभी निचले शब्दों को हटा दें। (पहले की तरह)

2) कई समूहों के मिलान के लिए पाइप ऑपरेटर का उपयोग करें;

2.1) जहां समूह 1 का उपयोग पहले पूंजी पत्र से पहले के एक या अधिक लोअरकेस अक्षरों से मेल खाने के लिए किया जाएगा। (यानी इसलिए मैं देश का नाम "चीन" रख पाऊंगा)

२.२) जहां समूह २ का उपयोग पहले बड़े अक्षर से पहले के एक या अधिक अपरकेस अक्षरों से मेल खाने के लिए किया जाएगा। (यानी इसलिए मैं देश का नाम "यूएसए" प्राप्त कर सकूंगा)

2.3) जहां समूह 3 का उपयोग कई शब्दों और स्थानों के लिए मेल खाने के लिए किया जाएगा जहां शब्दों में बड़े अक्षर हो सकते हैं, (यानी मुझे देश का नाम "पापुआ न्यू गिनी" मिल सकता है)

मैं regex का उपयोग करके पहले दो समूहों (2.1 और 2.2) को प्राप्त करने में कामयाब रहा हूं;

[A-Z]([a-z]+|[A-Z]+)

हालांकि जब तीसरे समूह को प्राप्त करने की कोशिश कर रहा हूं तो मुझे पाइप ऑपरेटर का उपयोग करके परिणाम नहीं मिल सकता है क्योंकि पाइप ऑपरेटर पहले समूह सेट (2.1) से मेल खाता है।

इसके लिए मैंने जो रेगेक्स एक्सप्रेशन का इस्तेमाल किया था;

[A-Z]([a-z]+|[A-Z]+|[a-zA-Zs]*)

क्या सभी समूहों से मिलान करने के लिए regex प्राप्त करने की जांच करने का एक तरीका है?

यहां है संपर्क मेरे regex को।

उत्तर:

जवाब के लिए 0 № 1

प्रति के अनुसार उत्तर दें टिप्पणी.

मान लें कि आपके पास सभी देशों की सूची है जैसे:

countries = ["Russia", "USA", "United States of America", "Zimbabwe"]
# this should contain all the countries, I just show an example here

तो आप इसे इस तरह से कर सकते हैं:

indexes = [text.find(country) for country in countries]
found_contries = [(index, country) for index, country in zip(indexes, countries)
if index != -1]

इस प्रकार हम ट्यूपल्स की एक सूची बनाते हैं (index, country) उन देशों के लिए जो वास्तव में पाठ में पाए जाते हैं (यदि यह नहीं मिला, text.find वापसी -1 और यह शर्त के अनुसार सूची से बाहर रखा गया है if index != -1)।

फिर देश को आपकी जरूरत है

min(found_contries)[1]

उदाहरण के लिए, आइए text = "lala lalala Zimbabwe lala USA"। फिर

indexes
[-1, 26, -1, 12]

found_contries
[(26, "USA"), (12, "Zimbabwe")]

min(found_contries)[1]
"Zimbabwe"

जवाब के लिए 0 № 2

संपादित करें: ओपी द्वारा अपना प्रश्न पूरी तरह से बदलने से पहले मैंने निम्नलिखित उत्तर पोस्ट किया

आप एक नियमित अभिव्यक्ति बाइनरी का उपयोग कर सकते हैं OR ऑपरेटर (द्वारा प्रस्तुत |) देश के नामों की सूची में से एक की खोज करें और मैचों को "समूह" में रखने के लिए कोष्ठक संचालक का उपयोग करें:

(.*(China|United Kingdom|England).*)*

आंतरिक .* आसपास के या देश के नामों के बीच के किसी भी पाठ को पकड़ें। बाहरी * समूह मिलान को तब तक दोहराएंगे जब तक कि सभी देश नामों का मिलान न हो जाए।

पर आप से जुड़ा हुआ पेज, उदाहरण के लिए, आप केवल हरे ("समूह" मैचों) मैचों का संदर्भ देंगे, पूर्ण मैचों का नहीं।

मैं इस प्रोग्राम को करने की सलाह देता हूं। आप देश के नामों की एक सूची पर लूप करेंगे और उन्हें अपने इनपुट स्ट्रिंग में खोजेंगे:

सरलीकृत पायथन उदाहरण:

all_country_names = ["China", "United Kingdom", "England"]
found_country_names = []
input = "In China there is the great wall."
for name in all_country_names:
if name in input:
found_country_names.append(name)