Компиляция шаблонов поиска в Python

1

Я должен искать шаблон либо внутри содержимого переменной, либо внутри файла данных. Ниже приведен код, который у меня есть:

import re

UserSpecifiedPattern = "segfault"

# find every instance of a user specified pattern
pattern =  re.compile( rb'(\.\W+)?([^.]?segfault[^.]*?\.)',
                       re.DOTALL | re.IGNORECASE | re.MULTILINE )

Моя проблема заключается в том, как указать переменную "re.compile". Значит, я сохраняю фактический шаблон для поиска в переменной. И я даю эту переменную re.compile. Ниже я полагаю, что это должно работать, но это не так:

import re

UserSpecifiedPattern = "segfault"

# find every instance of a user specified pattern
pattern =  re.compile( rb'(\.\W+)?([^.]?UserSpecifiedPattern[^.]*?\.)',
                       re.DOTALL | re.IGNORECASE | re.MULTILINE )

Я предполагаю, что это должно быть так?

import re

UserSpecifiedPattern = "segfault"

# find every instance of a user specified pattern
pattern =  re.compile( rb'(\.\W+)?([^.]?{UserSpecifiedPattern}[^.]*?\.)',
                       re.DOTALL | re.IGNORECASE | re.MULTILINE )
Теги:

1 ответ

1
Лучший ответ

поиск регулярного выражения с использованием ввода bytes, но, конечно, ваше имя переменной обрабатывается буквально.

Вы должны ввести свою переменную, например, используя format строки, а затем закодировать до байтов (у bytes объекта нет format поэтому он кодирует его впоследствии (здесь вы не можете использовать префикс b):

pattern =  re.compile(r'(\.\W+)?([^.]?{}[^.]*?\.)'.format(UserSpecifiedPattern).encode(),
                   re.DOTALL | re.IGNORECASE | re.MULTILINE )

заметки:

  • он работает для этого конкретного шаблона, который не использует {} для повторения выражений. Если вам нужно использовать это, удвойте фигурные скобки: ex: {{1,5}}
  • в зависимости от шаблона, который вы проходите, вам может потребоваться использовать re.escape на нем, если вы хотите, чтобы регулярное выражение увидело его буквально (это не имеет большого значения со словами)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню