2011-09-17 30 views
5

की तुलना में अलग-अलग समूह हैं, मैं प्ली का उपयोग कर रहा हूं और t.lex.lexmatch में संग्रहीत टोकन री मैच के बीच एक अजीब विसंगति देखी है, जैसा कि सामान्य रूप से परिभाषित एक sre_pattern की तुलना में मॉड्यूल। समूह (एक्स) के द्वारा बंद होने लगते हैं 1.प्लाई लेक्समैच नियमित अभिव्यक्ति में सामान्य समूह

मैं व्यवहार वर्णन करने के लिए मैं देख रहा हूँ एक सरल lexer परिभाषित किया है:

import ply.lex as lex 

tokens = ('CHAR',) 

def t_CHAR(t): 
    r'.' 
    t.value = t.lexer.lexmatch 
    return t 

l = lex.lex() 

(मैं t_error बारे में एक चेतावनी मिल लेकिन के लिए इसे अनदेखा । अब) अब मैं कुछ इनपुट lexer में फ़ीड और एक टोकन प्राप्त:

l.input('hello') 
l.token() 

मैं एक LexToken(CHAR,<_sre.SRE_Match object at 0x100fb1eb8>,1,0) मिलता है।

m = _.value 

तो अब मैं समूहों को देखो:

m.group() =>'h' मैं उम्मीद के रूप में मैं एक मैच वस्तु देखने के लिए चाहते हैं।

m.group(0) =>'h' जैसा कि मैं उम्मीद करता हूं।

m.group(1) =>'h', फिर भी मुझे उम्मीद है कि ऐसा कोई समूह न हो।

मैन्युअल इस तरह के एक नियमित अभिव्यक्ति बनाने के लिए इस की तुलना करें:

import re 
p = re.compile(r'.') 
m2 = p.match('hello') 

इससे अलग-अलग समूहों:

m2.group() = 'h' के रूप में मैं उम्मीद करते हैं।

m2.group(0) = 'h' जैसा कि मैं उम्मीद करता हूं।

m2.group(1) मुझे उम्मीद है कि IndexError: no such group देता है।

क्या कोई जानता है कि यह विसंगति क्यों मौजूद है?

उत्तर

4

पीएलवाई के संस्करण 3.4 में, ऐसा कारण यह है कि अभिव्यक्तियों को डॉकस्ट्रिंग से पैटर्न में कैसे परिवर्तित किया जाता है।

स्रोत को देखते हुए वास्तव में मदद करता है - लाइन lex.py की 746:

c = re.compile("(?P<%s>%s)" % (fname,f.__doc__), re.VERBOSE | self.reflags) 

मैं संस्करणों के बीच कुछ इस तरह पर निर्भर की सिफारिश नहीं होगा - यह कैसे काम करता है प्लाई के जादू का सिर्फ एक हिस्सा है ।

0

यह है कि समूह मिलान फ़ाइल में टोकन समारोह की स्थिति पर निर्भर करता है, मेरे लिए लगता है कि अगर समूहों वास्तव में सभी घोषित टोकन regexes के माध्यम से संचयी गया:

t_MYTOKEN1(t): 
     r'matchit(\w+)' 
     t.value = lexer.lexmatch.group(1) 
     return t 

    t_MYTOKEN2(t): 
     r'matchit(\w+)' 
     t.value = lexer.lexmatch.group(2) 
     return t