2011-09-17 37 views
5

Tôi đang sử dụng lớp và đã nhận thấy sự khác biệt lạ giữa kết hợp lại mã thông báo được lưu trữ trong t.lex.lexmatch, so với sre_pattern được định nghĩa theo cách thông thường mô-đun. nhóm (x) 's dường như được tắt bằng 1.Biểu thức chính quy pex lexmatch có các nhóm khác nhau so với thông thường

tôi đã xác định một lexer đơn giản để minh họa cho hành vi này tôi đang nhìn thấy:

import ply.lex as lex 

tokens = ('CHAR',) 

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

l = lex.lex() 

(tôi nhận được một cảnh báo về t_error nhưng bỏ qua nó cho . bây giờ) Bây giờ tôi ăn một số đầu vào cho lexer và nhận được một mã thông báo:

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

tôi nhận được một LexToken(CHAR,<_sre.SRE_Match object at 0x100fb1eb8>,1,0). Tôi muốn tìm một đối tượng thi đấu:

m = _.value 

Vì vậy, bây giờ tôi nhìn vào các nhóm:

m.group() =>'h' như tôi mong đợi.

m.group(0) =>'h' như tôi mong đợi.

m.group(1) =>'h', nhưng tôi hy vọng nó sẽ không có một nhóm như vậy.

Hãy so sánh này để tạo ra một biểu hiện thường xuyên như vậy bằng tay:

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

Điều này cho phép các nhóm khác nhau:

m2.group() = 'h' như tôi mong đợi.

m2.group(0) = 'h' như tôi mong đợi.

m2.group(1) cung cấp cho IndexError: no such group như tôi mong đợi.

Có ai biết tại sao sự khác biệt này tồn tại không?

Trả lời

4

Trong phiên bản 3.4 của PLY, lý do điều này xảy ra liên quan đến cách biểu thức được chuyển đổi từ docstrings sang mẫu.

Nhìn vào nguồn thực sự giúp đỡ - dòng 746 của lex.py:

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

tôi sẽ không khuyên bạn nên dựa vào một cái gì đó như thế này giữa các phiên bản - đây chỉ là một phần của sự kỳ diệu của PLY công trình như thế nào .

0

có vẻ như đối với tôi mà phù hợp với nhóm phụ thuộc vào vị trí của hàm mã thông báo trong tập tin, như thế nào nếu nhóm đã thực sự tích lũy qua tất cả các thẻ regexes tuyên bố:

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 
Các vấn đề liên quan