Как в регулярное выражение вставить переменную python
Перейти к содержимому

Как в регулярное выражение вставить переменную python

  • автор:

Как вставить переменную python в sql

Чтобы передать переменную в SQL запрос в Python, вы можете использовать параметризованный запрос. Вот пример:

import mysql.connector mydb = mysql.connector.connect( host="localhost", user="yourusername", password="yourpassword", database="mydatabase" ) mycursor = mydb.cursor() sql = "SELECT * FROM customers WHERE address = %s" adr = ("Yellow Garden 2", ) mycursor.execute(sql, adr) myresult = mycursor.fetchall() for x in myresult: print(x) 

В этом примере мы передаем переменную adr в SQL запрос. Мы используем %s в запросе как заполнитель для нашей переменной. Затем мы передаем нашу переменную в функцию execute() вместе с запросом.

Это позволяет избежать SQL инъекций и делает ваш код более безопасным.

Для более детального изучения вопроса «SQL инъекции» рекомендуем просмотреть урок Безопасность из курса Python: Веб-разработка (Flask)

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

Как сделать, чтобы в регулярном выражении вместо текста hello я мог использовать переменную $hello? Т.к. если подставлять переменную вместо текста, то регулярное выражение перестаёт работать.

dualCore
05.04.21 10:28:46 MSK

echo ‘hello world’ | grep -oP «$ \K(world)»

dexpl ★★★★★
( 05.04.21 10:32:20 MSK )

Чтобы результатом пайпа была какая-то строка, нужно чтобы переменная $hello содержала какую-то подстроку из строки hello world . Тогда пример dexpl будет работать.

kardjoe
( 05.04.21 10:38:41 MSK )
Последнее исправление: kardjoe 05.04.21 10:38:52 MSK (всего исправлений: 1)

А вообще, в bash есть встроенный regex, для которого не обязательно вызывать нестандартизированный perl-regex в grep. И сразу получим результат в переменной и без всяких пайпов.

$ hello=XXX $ [[ "XXX world" =~ "$hello "([[:alnum:]]*) ]] $ echo $ world 

vodz ★★★★★
( 05.04.21 11:20:48 MSK )
Ответ на: комментарий от vodz 05.04.21 11:20:48 MSK

на UNIX System V Release 3.2 нет bash, не портабельно

anonymous
( 05.04.21 11:23:07 MSK )
Ответ на: комментарий от anonymous 05.04.21 11:23:07 MSK

на UNIX System V Release 3.2 нет bash, не портабельно

У человека есть ТЗ, написать на bash. В современном мире если нет bash-а, то либо его поставят, либо такое ТЗ не будет. А вот grep-а с pcre надо оговаривать отдельно. ТС вроде уже третий топик создаёт на эту задачу, отказывающийся от правильного ответа, заключающегося в том, что если надо разбивать на слова (см его regex), то для этого изобретен awk, где нет проблем с переменными и прочими вычислениями третьего слова (см соседний топик). Упорно талдычит свой grep. Ну так пусть и пишет, что в задаче стоит не bash, а как сделать только на основе grep.

vodz ★★★★★
( 05.04.21 11:32:05 MSK )
Ответ на: комментарий от vodz 05.04.21 11:32:05 MSK

Спасибо за помощь и внимание к моей проблеме. Указанное регулярное выражение я использую чтобы оставить текст только между определёнными символами. Допустим у меня строка в которой надо оставить только текст между символами W и Y, можете подсказать как это более эффективно реализуется через awk?

dualCore
( 05.04.21 17:28:51 MSK ) автор топика
Ответ на: комментарий от dualCore 05.04.21 17:28:51 MSK

У вас ровно одна строка или целый файл на входе и соответственно на выходе?

в которой надо оставить только текст между символами W и Y

Это уникальные символы в строке?

vodz ★★★★★
( 05.04.21 18:39:58 MSK )
Ответ на: комментарий от vodz 05.04.21 18:39:58 MSK

На входе у меня набор текста, чаще всего это код веб страницы. На выходе у меня строка или несколько строк, из которых отсеян ненужный текст. Вот самая первая моя задача для которой мне как раз и подсказали решение с pcre
Задача получить в bash вывод со страницы https://www.postgresql.org/ftp/source/ , где содержались только бы номера версий ПО и ничего более.
Вот так я решаю эту задачу: curl -s https://www.postgresql.org/ftp/source/ | grep -Po ‘alt=«v\K.*?(?=»)’
Т.е. оставляю только вывод который находится между alt=«v и » Как вы предлагаете решать такие задачи через awk?

dualCore
( 05.04.21 20:00:56 MSK ) автор топика
Ответ на: комментарий от dualCore 05.04.21 20:00:56 MSK

где содержались только бы номера версий ПО и ничего более.

curl -s https://www.postgresql.org/ftp/source/ | grep -o 'href="v[0-9.]\+/"' | grep -o 'v[0-9.]\+' 

Переменная внутри регулярного выражения. Как вставить?

Нужно цель поиска (имя) задать в виде переменной, которая будет вводиться.

Пробовал сделать это объединением строк —

1 2 3 4
Name = Bogdan #( ) Введённое имя look1 = r'Name. ([\w\ _-]*? #( Первая часть регулярки ) look2 = [\w\ _-]*?)' #( Вторая часть регулярки ) lookName = look1 + Name + look2 #( Собираем в единую строку )

По всем хелпам, документации, советам и т.д. это должно работать.

Распечатав lookName в любом месте программы мы видим правильную строку для поиска. т.е. она не меняется и не портится.
Но поиск не работает. Никаких ошибок, никаких сообщений.

Может быть кто-то сталкивался с подобной задачей и может подсказать как её реализовать?

Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Сравнение групп внутри регулярного выражения
Допустим есть рег. выражение вида (?<m1>)(?<m2>) мне нужно в самов выражении проверить.

Можно ли внутри самого регулярного выражения использовать функции
Здравствуйте! Я бы хотела спросить, можно ли внутри самого регулярного выражения использовать.

Как распарсить строку с помощью регулярного выражения
Как распарсить строку такого вида? "слово — любое_слово любое_слово — слово", где любых слов может.

530 / 179 / 38
Регистрация: 18.08.2012
Сообщений: 886

ЦитатаСообщение от TheBogdan Посмотреть сообщение

Name = Bogdan
это вы так строку задаёте?
или. всё же

Name = "Bogdan"

Регистрация: 08.11.2019
Сообщений: 66

Как только отправил сообщение, сразу же пришла мысль и, как оказалось, правильная

в re нужно передавать строку без индекса r

1 2 3 4 5
неправильно r'Name. ([\w\ _-]*?Bogdan[\w\ _-]*?)' правильно Name. ([\w\ _-]*?Bogdan[\w\ _-]*?)

Нигде почему-то это не уточнялось, а сам сразу не додумался.
Вопрос закрыт. Извините за беспокойство.

Добавлено через 1 минуту

ЦитатаСообщение от untyped Посмотреть сообщение

или. всё же
Да, в программе так и есть, просто при наборе поста пропустил.
Просто Лис

Эксперт Python

5318 / 3332 / 1021
Регистрация: 17.05.2012
Сообщений: 9,765
Записей в блоге: 9

Лучший ответ

Сообщение было отмечено TheBogdan как решение

Решение

Ничё не понял, но так должно работать:

name = 'Bogdan' searchName = re.findall(r'([\w\ _-]*?<>[\w\ _-]*?)'.format(name), searchsource)

Добавлено через 1 минуту
Или так:

r'([\w\ _-]*?%s[\w\ _-]*?)' % (name,)

87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Как должна выглядеть формула регулярного выражения?
Добрый день! Ситуация: есть прайс, из которого нужно вытащить только габариты товара.

Как обратиться к 1-ому из элементов регулярного выражения
Доброго времени суток. Не могу понять как обратиться к 1-ому из элементов регулярного.

Как вывести результат работы регулярного выражения?
Приветствую, комрады. Стандартный кусок кода, показывающий работу с регекспом: Sub qwe() Dim.

Как из регулярного выражения построить конечный автомат?
У меня есть регулярное выражение: ^?*?(??)*(?+)?$. Как мне из него построить конечный автомат? В.

Как написать функцию проверки регулярного выражения?
На php так, а как на js? //Проверить строку — только английские буквы и цифры и нижнее.

Как определить позицию вхождения регулярного выражения в строку?
Есть ли способ как то определить позицию вхождения регулярного выражения в строке? Применяя функция.

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

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

Отслеживать
25.9k 7 7 золотых знаков 31 31 серебряный знак 48 48 бронзовых знаков
задан 18 мар 2019 в 11:27
53 1 1 серебряный знак 3 3 бронзовых знака

в таких воспросах принято приводить небольшие примеры данных (строк в вашем случае) на входе и то что вы хотите получить на выходе. «Как создать минимальный, самодостаточный и воспроизводимый пример?»

18 мар 2019 в 11:35

@минусовальщикам, не надо минусовать вопросы новых (неопытных) участников, лучше объяснить как они могут улучшить качество своих вопросов. PS кроме того поставив минус участнику с репутацией 1 , вы никакх не уменьшите репутацию данного участника, но подпортите свою карму — в вашем профиле счетчик отрицательных отзывов увеличиться на 1 😉

18 мар 2019 в 11:39

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

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

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

reg_exp = r"'<>\s'".format(variable) reg_exp = fr"'\s'" 

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

reg_exp = r"'<>\s'".format(re.escape(variable)) reg_exp = fr"'\s'" 

Регулярные выражения в 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. Она удобна, так как переменные вставляются в строковой литерал как есть в фигурных скобках. Однако надо помнить, что двойные фигурные скобки задают буквальные фигурные скобки, 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 :

print(">".format(variable)) # => <> 

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

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

reg_exp = r"'<>\s'".format(re.escape(variable)) ^^^^^^^^^^^^^^^^^^^ 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *