Как использовать флаги с регулярными выражениями python в строковой нотации?

#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 повторениям предыдущего RE

4. Значит, вообще нет никакого способа использовать флаг игнорирования регистра? Я хочу использовать этот флаг специально, мне не нужен обходной путь.

Ответ №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.