Я использую 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
, как я ожидаю.
Кто-нибудь знает, почему существует это несоответствие?