【问题标题】:python - is there a intelligent way for formatting strings with quotations?python - 有没有一种用引号格式化字符串的智能方法?
【发布时间】:2019-02-22 14:22:37
【问题描述】:

我正在使用neo4j python lib 来操作 neo4j 图形数据库。

我需要像

那样格式化密码查询
query = 'create (n:Person {{nickname: "{0}"}}) return n;'.format(nickname)

如果昵称本身包含",如A"B,则生成的查询将是

create (n:Person {nickname: "A"B"}) return n; 会在 cql 运行时引发语法错误。

事实上,密码查询语言支持''"" 来表示一个字符串。

所以我的问题是,如果有一个聪明的方法,当变量昵称包含'"时,格式化的字符串可以自动使用正确的引号吗?

【问题讨论】:

  • 查询语言与用户输入结合使用会导致注入漏洞。通常库中应该有一个函数来进行安全引用。

标签: python neo4j


【解决方案1】:

您可以使用repr 函数将字符串格式化为正确的引号:

query = 'create (n:Person {{nickname: {0}}}) return n;'.format(repr(nickname))

因为它的行为正是你想要的,所以当字符串包含单引号时用双引号将给定的字符串括起来,当字符串包含双引号时用单引号括起来:

>>> print(repr("A'B"))
"A'B"
>>> print(repr('A"B'))
'A"B'

【讨论】:

  • 这就是我要找的。​​span>
【解决方案2】:

您可以使用"""Lorem ipsum""" 格式字符串,它允许您使用符号和ascii 字符。即

query = """create (n:Person {{nickname: "{0}"}}) return n;""".format(nickname)

您还可以在字符串中使用单引号双引号

【讨论】:

  • 返回与我在 OP 中写的相同,问题是我将 "{0}" 放在原始字符串中。所以它总是用变量替换{0}
  • 试试这个query = """create (n:Person {{nickname: {0}}}) return n;""".format(repr(nickname))
【解决方案3】:

您需要的是“引号转义”。最简单的方法是:

nickname='A"B'
query = 'create (n:Person {{nickname: "{0}"}}) return n;'.format(nickname.replace('"','\\"'))
print(query)

>>> 
create (n:Person {nickname: "A\"B"}) return n;

如果您想要更“正式”的方式,可以执行以下操作:

import json
person = {'nickname': 'A"B'}
query = 'create (n:Person {0}) return n;'.format(json.dumps(person))
print(query)

【讨论】:

  • 您的第一种方法有效,但第二种方法无效,因为查询将是create (n:Person {"nickname": "A\\"B"}) return n
  • 你说得对,我忽略了它。主要思想是使用json 模块来处理引号转义。这里是修复:query = 'create (n:Person {{nickname: "{0}"}}) return n;'.format(json.dumps(nickname)) .
猜你喜欢
  • 2023-03-09
  • 1970-01-01
  • 2019-12-27
  • 2011-01-30
  • 2019-01-14
  • 1970-01-01
  • 2011-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多