#python #ply
#питон #ply
Вопрос:
Мне нужно использовать PLY для синтаксического анализатора, и PLY заставляет вас писать регулярные выражения в string ntoation внутри определения токена. Например (из документации):
# A regular expression rule with some action code
def t_NUMBER(t):
r'd '
t.value = int(t.value)
return t
# Define a rule so we can track line numbers
def t_newline(t):
r'n '
t.lexer.lineno = len(t.value)
Мне было интересно, как писать более сложные регулярные выражения, используя эту нотацию, в частности, как использовать флаг IGNORECASE для RE.
Комментарии:
1. вы пишете выражение
r'd '
. По сути, это ничего не дает. Вы не присваиваете это какой-либо переменной и не используете ее каким-либо образом. Пожалуйста, приведите пример того, какой шаблон символов вы ищете.d
означает что-то в регулярном выражении (import re
),r'd '
отличается отr'd?'
и отличается отr'd *'
2. Это пример из документации ( ply.readthedocs.io/en/latest/ply.html#parsing-basics ). PLY работает таким образом. Мне нужно использовать регистр игнорирования с очень простым шаблоном: буквой «a» или A, но я хочу использовать флаг специально, потому что я хочу протестировать его, чтобы использовать его позже с более сложными шаблонами.
3. итак, для a или A вы можете сделать
r"[a-A]"
, или вы можете добавить другую директиву:r"[a-A] "
.*
Приводит к тому, что результирующий RE соответствует 0 или более повторениям предыдущего RE.Приводит к тому, что результирующий RE соответствует 1 или более повторениям предыдущего RE.
?
Приводит к тому, что результирующий RE соответствует 0 или 1 повторениям предыдущего RE4. Значит, вообще нет никакого способа использовать флаг игнорирования регистра? Я хочу использовать этот флаг специально, мне не нужен обходной путь.
Ответ №1:
Чтобы включить флаг игнорирования регистра, вы можете использовать (?i)
в начале регулярного выражения. Например:
def t_id(t):
r'(?i)[a-z_][a-z0-9_] '
Комментарии:
1. нужно ли использовать is подобным
r'^(?i)[a-z_][a-z0-9_] '
образом, чтобы он помечал начало инструкции.2. Спасибо, это именно то, что я хотел узнать, спасибо 🙂
3. @hussam Вам не нужно привязывать регулярные выражения к PLY.