2016-01-18 2 views
-1

Я пишу Laxer для C в Python и сталкиваюсь с этой проблемой:регулярного выражения числа ошибок идентификации питон

Это моя функция, чтобы определить число:

def t_INT_CONSTANT(t): 
    r'(\d+ | 0b[0-1]+)' 
    t.type = reserved_map.get(t.value,"INT_CONSTANT") 
    return t 

Я использую его идентичность десятичные и двоичные целые числа ,

Проблема заключается в том, что когда выражение равно 0b101010, оно делает 0 int и идентификатор b101010 (другая функция определена выше этого).

Он хорошо работает с:

#r'(0b[0-1]+ | \d+)' 

Что такое проблема с 1-го? Почему 2-я работа?

ответ

1

Обратите внимание, что символы совпадающих с помощью первого шаблона (то есть, шаблон, который существует до того, чтобы |), не будет сопровождаться вторым шаблоном (узора на правой стороне |).

Если вы используете \d+|0b[0-1]+ регулярное выражение, то первый \d+ должен соответствовать 0, который существует только перед тем b в 0b101010. Когда двигатель регулярного выражения использует второй шаблон, 0b[0-1]+, он не найдет соответствия.

Если вы отмените образы, такие как 0b[0-1]+|\d+, теперь он сначала проверяет на 0b[0-1]+. Поэтому поместите шаблоны в соответствии с приоритетом. узор с левой стороны имеют более высокий приоритет, чем тот, который находится справа.

Смежные вопросы