ply lexmatch регулярное выражение имеет другие группы, чем обычное re

Я использую 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: нет такой группы, как я ожидаю.

Кто-нибудь знает, почему это несоответствие существует?

6
задан murftown 17 September 2011 в 01:16
поделиться