मैंने यह रेगेक्स लिखा है जो अभिव्यक्ति 'res=3+x_sum*11' को लेक्समेस में विभाजित करता है

import re
print(re.findall('(\w+)(=)(\d+)(\*|\+)(\w+)(\*|\+)(\d+)', 'res=3+x_sum*11'))

मेरे आउटपुट के साथ इस तरह दिख रहा है:

[('res', '=', '3', '+', 'x_sum', '*', '11')]

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

[('', 'res', ''), ('', '', '='), ('3', '', ''), ('', '', '+'),

('', 'x_sum', ''), ('', '', '*'), ('11', '', '')] 

मैं उस तरह के आउटपुट को वापस करने के लिए फिर से कैसे ढूंढूं?

4
Omar 3 मई 2018, 15:51

1 उत्तर

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

आप स्ट्रिंग का उपयोग करके टोकननाइज़ कर सकते हैं

re.findall(r'(\d+)|([^\W\d]+)|(\W)', s)

रेगेक्स डेमो देखें। ध्यान दें कि पैटर्न में कई कैप्चरिंग समूह होने पर re.findall टुपल्स की सूची लौटाता है। उपरोक्त पैटर्न में 3 कैप्चरिंग समूह हैं, इस प्रकार, प्रत्येक टपल में 3 तत्व होते हैं: 1+ अंक, 1+ अक्षर/अंडरस्कोर, या एक गैर-शब्द चार।

अधिक विवरण

  • (\d+) - समूह 1: 1+ अंक कैप्चर करना
  • | - या
  • ([^\W\d]+) - गैर-शब्द और अंक वर्णों के अलावा समूह 2: 1+ वर्णों को कैप्चर करना (अक्षर या अंडरस्कोर)
  • | - या
  • (\W) - समूह 3 को कैप्चर करना: एक गैर-शब्द वर्ण।

देखें पायथन डेमो:

import re
rx = r"(\d+)|([^\W\d]+)|(\W)"
s = "res=3+x_sum*11"
print(re.findall(rx, s))
# => [('', 'res', ''), ('', '', '='), ('3', '', ''), ('', '', '+'), ('', 'x_sum', ''), ('', '', '*'), ('11', '', '')]
1
Wiktor Stribiżew 3 मई 2018, 16:15