аватар question@mail.ru · 01.01.1970 03:00

Использование переменной в регулярном выражении Python

Салют! Помогите пожалуйста решить казалось бы тривиальную, но за неимением опыта в программировании,абсолютно непосильную мне задачку :)

mt=re.findall(r'\'""variable""\s\'')

Вместо ""variable"" должна быть переменная,в которую будут подставятся разные строки, а как это преподнести правильно не знаю.

аватар answer@mail.ru · 01.01.1970 03:00

Если коротко, то...

Если в переменной содержатся шаблоны регулярного выражения:

reg_exp = r""'{}\s'"".format(variable)reg_exp = fr""'{variable}\s'""

Если текст переменной содержит буквальный текст:

reg_exp = r""'{}\s'"".format(re.escape(variable))reg_exp = fr""'{re.escape(variable)}\s'""

Регулярные выражения в Python задаются с помощью строковых литералов, поэтому проблема использования переменной в регулярном выражении в Python сводится к проблеме использования переменных в строковом литерале.

Способы добавления переменной в строку

Существует множество способов:

  • Конкатенация строк (): reg_exp = r""'"" + variable + r""\s'""
  • Оператор форматирования строк %s: reg_exp = r""'%s\s'"" % variable
  • : reg_exp = r""'{}\s'"".format(variable) или reg_exp = r""'{x}\s'"".format(x=variable)
  • Интерполяция строк (доступна с Python 3.6): reg_exp = rf""'{variable}\s'""

См. (Python 3.7.3).

Что выбрать?

Интерполяция появилась относительно недавно, она доступна только в Python начиная с версии 3.5. Она удобна, так как переменные вставляются в строковой литерал как есть в фигурных скобках. Однако надо помнить, что двойные фигурные скобки задают буквальные фигурные скобки, f""{{"" = {, а f""}}"" = }.

Метод str.format очень похож на интерполяцию. Задав один аргумент, его можно повторять сколько угодно раз с помощью {x}, где x — порядковый номер аргумента. r""'{0}':\s+'{0}'"".format(variable) объявляет выражение 'abc':\s+'abc'. Именные аргументы упрощают (иногда и сокращают) использование переменных в строке. r""'{x}':\s+'{x}'"".format(x=variable) в результате даст то же выражение, что и в предыдущем примере. При задании нескольких аргументов, которые используются лишь один раз в строке, можно использовать {} без указания индекса: another=""def"";print(r""'{}':\s+'{}'"".format(variable,another)) даст выражение 'abc':\s+'def'.

При конкатенации строк нет проблем с ""экранированием"" символов фигурных скобок (см. следующий абзац), но конструкция получается менее удобной для чтения и есть риск ""забыть"" какой-нибудь префикс (например, r).

Интерполяция и фигурные скобки

Будьте осторожны с фигурными скобками при интерполяции: двойные фигурные скобки задают буквальные символы { и }, что бывает очень важно при использовании интервальных квантификаторов:

# Интерполяция и фигурные скобкиprint(f""{variable}"")# => abcprint(f""{{variable}}"")# => {variable}print(f""{{{variable}}}"")# => {abc}

То же относится и к методу str.format:

print(""{{}}"".format(variable))# => {}

Специальные символы в переменной

Если текст переменной может содержать специальные метасимволы регулярных выражений (например (, ), [, +, * и т.д.), рекомендуется использовать метод re.escape:

reg_exp = r""'{}\s'"".format(re.escape(variable))                           ^^^^^^^^^^^^^^^^^^^

Последние

Похожие