python - 通过序列将一个字符串中的单词替换成另一个字符串

1 人不认可

我正试图替换在引号中的第一个词,从一个 串a 中 "value "的第一个实例。 string 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 ' '''

expected output

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

4 个评论
For SQL, use substitution to prevent injection. stackoverflow.com/questions/40679501/...
在问题中显示你所尝试的正确格式化的代码。
这是否回答了你的问题? 如何替代变量来查询SQL?
到目前为止,我已经试过了,但无法达到我想要的效果。 输入re f = open(filename, 'r+') text = f.read() text = re.sub(" value ",aa[0], text) f.seek(0) f.write(text) f.truncate() f.close()
python
regex
string
Abhishek Mamdapure
Abhishek Mamdapure
发布于 2020-02-28
2 个回答
Alex Sveshnikov
Alex Sveshnikov
发布于 2020-02-28
已采纳
0 人赞同

你可以用正则表达式 '(.*?)'.*?'(.*?)' 来提取参数。然后你应该使用 参数替换 到你的SQL请求中,不要使用简单的字符串替换。

为什么你不想使用简单的字符串替换来形成一个SQL请求?因为你将自己暴露在一个 SQL injection 黑客攻击。考虑到有人向你提供以下输入。

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将撇号前面的反斜杠视为转义字符,所以它将把这个选择视为搜索一个名字非常奇怪的公司' and DEVICE_TYPE =(是的,公司名称以撇号开头),这个搜索与一个条件OR 1=1相结合。由于1=1的条件总是真的,所以整个搜索的条件都是真的,你会得到DIM_DEVICE_TYPE表中所有条目的完整列表。

kederrac
kederrac
发布于 2020-02-28
0 人赞同

你可以使用正则表达式从 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)

outptu:

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

你可以看一下。