Переменная внутри регулярного выражения. Как вставить?
Нужно цель поиска (имя) задать в виде переменной, которая будет вводиться.
Пробовал сделать это объединением строк —
Name = Bogdan #( ) Введённое имя look1 = r'Name. ([\w\ _-]*? #( Первая часть регулярки ) look2 = [\w\ _-]*?)' #( Вторая часть регулярки ) lookName = look1 + Name + look2 #( Собираем в единую строку )
По всем хелпам, документации, советам и т.д. это должно работать.
Распечатав lookName в любом месте программы мы видим правильную строку для поиска. т.е. она не меняется и не портится.
Но поиск не работает. Никаких ошибок, никаких сообщений.
Может быть кто-то сталкивался с подобной задачей и может подсказать как её реализовать?
Сравнение групп внутри регулярного выражения
Допустим есть рег. выражение вида (?<m1>)(?<m2>) мне нужно в самов выражении проверить.
Можно ли внутри самого регулярного выражения использовать функции
Здравствуйте! Я бы хотела спросить, можно ли внутри самого регулярного выражения использовать.
Как распарсить строку с помощью регулярного выражения
Как распарсить строку такого вида? "слово — любое_слово любое_слово — слово", где любых слов может.
Сообщение от TheBogdan
Как только отправил сообщение, сразу же пришла мысль и, как оказалось, правильная
в re нужно передавать строку без индекса r
неправильно r'Name. ([\w\ _-]*?Bogdan[\w\ _-]*?)' правильно Name. ([\w\ _-]*?Bogdan[\w\ _-]*?)
Нигде почему-то это не уточнялось, а сам сразу не додумался.
Вопрос закрыт. Извините за беспокойство.
Добавлено через 1 минуту
Сообщение от untyped
Сообщение было отмечено TheBogdan как решение
Решение
Ничё не понял, но так должно работать:
name = 'Bogdan' searchName = re.findall(r'([\w\ _-]*?<>[\w\ _-]*?)'.format(name), searchsource)
Как должна выглядеть формула регулярного выражения?
Добрый день! Ситуация: есть прайс, из которого нужно вытащить только габариты товара.
Как обратиться к 1-ому из элементов регулярного выражения
Доброго времени суток. Не могу понять как обратиться к 1-ому из элементов регулярного.
Как вывести результат работы регулярного выражения?
Приветствую, комрады. Стандартный кусок кода, показывающий работу с регекспом: Sub qwe() Dim.
Как из регулярного выражения построить конечный автомат?
У меня есть регулярное выражение: ^?*?(??)*(?+)?$. Как мне из него построить конечный автомат? В.
Как написать функцию проверки регулярного выражения?
На php так, а как на js? //Проверить строку — только английские буквы и цифры и нижнее.
Как определить позицию вхождения регулярного выражения в строку?
Есть ли способ как то определить позицию вхождения регулярного выражения в строке? Применяя функция.
Использование переменной в регулярном выражении Python
Вместо «variable» должна быть переменная,в которую будут подставятся разные строки, а как это преподнести правильно не знаю.
Ответы (2 шт):
reg_exp = r'\'' + variable + r'\s\'' mt=re.findall(reg_exp)
Если коротко, то.
Если в переменной содержатся шаблоны регулярного выражения:
reg_exp = r"'<>\s'".format(variable)
Если текст переменной содержит буквальный текст:
reg_exp = r"'<>\s'".format(re.escape(variable))
Регулярные выражения в Python задаются с помощью строковых литералов, поэтому проблема использования переменной в регулярном выражении в Python сводится к проблеме использования переменных в строковом литерале.
Способы добавления переменной в строку
Существует множество способов:
- Конкатенация строк (предложена Эникейщиком): reg_exp = r»‘» + variable + r»\s'»
- Оператор форматирования строк %s : reg_exp = r»‘%s\s'» % variable
- Метод str.format : reg_exp = r»‘<>\s'».format(variable) или reg_exp = r»‘\s'».format(x=variable)
- Интерполяция строк (доступна с Python 3.6): reg_exp = rf»‘\s'»
См. демо онлайн (Python 3.5, без поддержки интерполяции).
Что выбрать?
Интерполяция появилась относительно недавно, она доступна только в Python начиная с версии 3.5. Она удобна, так как переменные вставляются в строковой литерал как есть в фигурных скобках. Однако надо помнить, что двойные фигурные скобки задают буквальные фигурные скобки, f»>» = > .
Метод str.format очень похож на интерполяцию. Задав один аргумент, его можно повторять сколько угодно раз с помощью , где x — порядковый номер аргумента. r»»:\s+»».format(variable) объявляет выражение ‘abc’:\s+’abc’ . Именные аргументы упрощают (иногда и сокращают) использование переменных в строке. r»»:\s+»».format(x=variable) в результате даст то же выражение, что и в предыдущем примере. При задании нескольких аргументов, которые используются лишь один раз в строке, можно использовать <> без указания индекса: another=»def»;print(r»‘<>‘:\s+’<>‘».format(variable,another)) даст выражение ‘abc’:\s+’def’ .
При конкатенации строк нет проблем с «экранированием» символов фигурных скобок (см. следующий абзац), но конструкция получается менее удобной для чтения и есть риск «забыть» какой-нибудь префикс (например, r ).
Интерполяция и фигурные скобки
Будьте осторожны с фигурными скобками при интерполяции: двойные фигурные скобки задают буквальные символы < и >, что бывает очень важно при использовании интервальных квантификаторов:
# Интерполяция и фигурные скобки print(f"") # => abc print(f"<>") # => print(f"<<>>") # =>
То же относится и к методу str.format :
Специальные символы в переменной
Если текст переменной может содержать специальные метасимволы регулярных выражений (например ( , ) , [ , + , * и т.д.), рекомендуется использовать метод re.escape :
reg_exp = r"'<>\s'".format(re.escape(variable)) ^^^^^^^^^^^^^^^^^^^