python - заменить слова из одной строки в другую последовательностью - PullRequest
0 голосов
/ 28 февраля 2020

Я пытаюсь заменить первое слово в кавычках из строки на первый экземпляр 'значения' в строке b и т. Д.

a = What is the id where we have 'sony electronics' as company name and 'pc' as the device type?

b = '''select * from DIM_DEVICE_TYPE where COMPANY_NAME = ' value ' and DEVICE_TYPE = ' value ' '''

ожидаемый результат

select * from DIM_DEVICE_TYPE where COMPANY_NAME = 'sony electronics' and DEVICE_TYPE = 'pc'

Ответы [ 2 ]

0 голосов
/ 28 февраля 2020

вы можете использовать регулярное выражение для извлечения искомых подстрок из a, а затем вы можете использовать str.replace для замены в b

import re


a = "What is the id where we have 'sony electronics' as company name and 'pc' as the device type?"
b = "select * from DIM_DEVICE_TYPE where COMPANY_NAME = ' value ' and DEVICE_TYPE = ' value '"

it = re.finditer("'(.+?)'", a)

value = ' value '
for _ in range(b.count(value)):
    b = b.replace(value, next(it).group(1), 1)

b

outptu:

"select * from DIM_DEVICE_TYPE where COMPANY_NAME = 'sony electronics' and DEVICE_TYPE = 'pc'"

Вы можете просмотреть:

0 голосов
/ 28 февраля 2020

Вы можете извлечь параметры с помощью регулярного выражения '(.*?)'.*?'(.*?)'. Затем вы должны использовать подстановку параметров в вашем запросе SQL, не используйте простую замену строк.

ОБНОВЛЕНО

Почему вы не хотите использовать простую замену строки для формирования SQL запроса? Потому что вы подвергаетесь хакерской атаке SQL инъекция . Предположим, что кто-то предоставил вам следующий ввод:

What is the id where we have '\' as company name and ' OR 1=1;' as the device type?

Теперь у вас есть две совпадающие группы символов между апострофами:

group 1: a single backslash character
group 2: a string ' OR 1=1;'

После подстановки в выходную строку вы получите

select * from DIM_DEVICE_TYPE where COMPANY_NAME = '\' and DEVICE_TYPE = ' OR 1=1;'

Что будет дальше? Например, MySQL рассматривает обратную косую черту sh перед апострофом как escape-символ, поэтому он будет рассматривать этот выбор как поиск компании с очень странным именем ' and DEVICE_TYPE = (да, название компании начинается с апостроф), и этот поиск объединяется с условием ИЛИ 1 = 1. Поскольку условие 1 = 1 всегда выполняется, все условие поиска выполняется, и вы получите полный список всех записей в вашей таблице DIM_DEVICE_TYPE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...