Я использую ply и заметил странное несоответствие между повторным соответствием токена, хранящимся в t.lex.lexmatch, по сравнению с sre_pattern, определенным обычным образом с помощью модуля re. Группа (x), кажется, отличается на 1.
Я определил простой лексер, чтобы проиллюстрировать поведение, которое я вижу:
import ply.lex as lex
tokens = ('CHAR',)
def t_CHAR(t):
r'.'
t.value = t.lexer.lexmatch
return t
l = lex.lex()
(Я получаю предупреждение о t_error, но пока игнорирую его.) Теперь я ввожу некоторые данные в лексер и получаю токен:
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
, как я и ожидал.
Кто-нибудь знает, почему существует это несоответствие?