मैं इस रेगेक्स 'n't [0-9]+(\.[0-9][0-9]?)?' के साथ एक वाक्य में सभी "n't" खोजना चाहता हूं। और RegExr में इसका कार्य ठीक है:

enter image description here

लेकिन जब मैं इसे इस कोड के साथ करने की कोशिश करता हूं, तो यह काम नहीं करता है:

txt = "japan isn't 56 country in Europe."
nt = re.findall(r"n't [0-9]+(\.[0-9][0-9]?)?",txt)
print(nt)
-1
Anurag Dutta 3 नवम्बर 2020, 09:57

2 जवाब

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

यह आपकी स्क्रिप्ट की एक सूक्ष्म समस्या है, जिसे निम्नलिखित हल करता है:

txt = "japan isn't 56 country in Europe."
nt = re.findall(r"n't [0-9]+(?:\.[0-9][0-9]?)?",txt)
print(nt)    # prints ["n't 56"]

आपके re.findall मूल कॉल में, आप इस पैटर्न का उपयोग कर रहे थे:

n't [0-9]+(\.[0-9][0-9]?)?

इसका अर्थ है कि पहला कैप्चर समूह वैकल्पिक शब्द .123 है। re.findall API के साथ, यदि आप एक कैप्चर ग्रुप को निर्दिष्ट करते हैं, तो वह वही है जो वापस किया जाएगा। यह देखते हुए कि आपके इनपुट में नहीं यह समूह है, आपकी परिणामी सूची खाली थी। मेरे सही संस्करण में, मैंने ?: का उपयोग करके कैप्चरिंग ग्रुप निष्क्रिय बनाया। यदि आप किसी भी स्पष्ट कैप्चर समूह को नहीं निर्दिष्ट करते हैं, तो संपूर्ण मिलान पैटर्न वापस आ जाएगा, जो कि आप यहां चाहते हैं।

0
Tim Biegeleisen 3 नवम्बर 2020, 23:45

findall कोष्ठकों की बात करें तो यह थोड़ा अजीब है। एक बार जब आप उन्हें वहां ले जाते हैं, तो यह केवल उस समूह का परिणाम देता है, पूरे मैच का नहीं। आप कोष्ठकों को गैर-कैप्चर कर सकते हैं:

>>> nt = re.findall(r"n't [0-9]+(?:\.[0-9][0-9]?)?",txt)
>>> print(nt)
["n't 56"]
0
mrks 3 नवम्बर 2020, 07:01