2017-06-09 11 views
6

क्या पाइथन में नामित समूह में समान नाम का उपयोग करने का कोई तरीका है? उदा। (?P<n>foo)|(?P<n>bar)पायथन रेगेक्स: नामित समूहों में डुप्लिकेट नाम

उपयोग मामला:
/(?=videos)((?P<type>videos)/(?P<id>\d+))|(?P<type>\w+)/?(?P<v>v)?/?(?P<id>\d+)?
इस तार से :

  • /चैनल/v/123
  • /ch/v/41,500,082 मैं इस regex के साथ type और id पर कब्जा करने की कोशिश कर रहा हूँ
  • /चैनल
  • /वीडियो/41500082

अब मैं हो रही है त्रुटि के लिए: redefinition of group name 'id' as group 6; was group 3

+0

एक नामित कब्जा कर लिया समूह अद्वितीय है जिसे केवल नए 'रेगेक्स' मॉड्यूल द्वारा समर्थित किया जाता है: '(? | ...) '- क्या आपके पास एक ऑनलाइन डेमो है जिसे आप प्राप्त करने का प्रयास कर रहे हैं? इसके अतिरिक्त, एक सशर्त रेगेक्स या लुकराउंड अधिकतर पर्याप्त होंगे। – Jan

उत्तर

7

जवाब है: अजगर re समान नाम समूहों समर्थन नहीं करता।

अजगर PyPi regex module एक शाखा रीसेट सुविधा समर्थन करता है:

Branch reset

(?|...|...)

Capture group numbers will be reused across the alternatives, but groups with different names will have different group numbers.

Examples:

>>> regex.match(r"(?|(first)|(second))", "first").groups()
('first',)
>>> regex.match(r"(?|(first)|(second))", "second").groups()
('second',)

Note that there is only one group.

और यहाँ एक जीवित Python 2.7 demo है: जब तक आप एक शाखा रीसेट का उपयोग कर रहे

import regex 
s = "foo bar" 
rx = regex.compile(r"(?P<n>foo)|(?P<n>bar)") 
print([x.group("n") for x in rx.finditer(s)]) 
// => ['foo', 'bar'] 
संबंधित मुद्दे