Я использую ply и заметил странное несоответствие между токеном re, хранящимся в t.lex.lexmatch, по сравнению с sre_pattern, определенным обычным образом с модулем re. Похоже, что group(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 объект на 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: нет такой группы
, как я ожидаю.
Кто-нибудь знает, почему это несоответствие существует?