我正在尝试检索此SQL语句中字段的值,但是我遇到了转义引号字符的问题:
sql = "INSERT INTO `shops` VALUES (35723,'Counsel\'s kitchen');"
我正在玩以下各种变体,但都不令人满意:
re.select("\(\d*, '([^']*)',", sql);
那是:
\(\d*, ' Opening parentheses followed by any amount of numerals followed by a comma, followed by a space, followed by a single quote.
([^']*) Retrieve all characters other than a single quote.
', Single quote, comma
到目前为止我的最佳尝试:
re.select("\(\d*, '(\.*)','", sql);
那是:
\(\d*, ' Opening parentheses followed by any amount of numerals followed by a comma, followed by a space, followed by a single quote.
(\.*) Retrieve all characters.
',' Single quote, comma, single quote.
但是,我真的想要一种方式来表达“每个角色,包括两个字符的字符串\'
,但不包括单个字符'
”。我曾考虑过简单地用一些模糊的字符串替换\'
,执行'(\.*)'
,然后用'
替换隐藏的字符串(没有转义字符,因为它不再需要)。然而,作为Python,肯定有一种更聪明的方式!
请注意,字符串实际上在实际输出中重复了很多次,并且我确实需要所有值(理想情况下在列表中):
sql = """
INSERT INTO `shops` VALUES (35723,'Counsel\'s kitchen','Some address'),(32682,'Anderson and his bar','12 Main street'),(32491,'Sid\'s guitar\'s string','Old London'),(39119,'Roger\'s wall',''),(45914,'David drinks a beer','New London');
"""
答案 0 :(得分:2)
建立@HamZa的建议 当你可以保证单引号时,它更容易在更大的上下文中分组:
'(?:\\'|[^'])*'
否则,如果添加其他组,则必须更新后向引用
这也应该稍快一点,因为它没有前瞻 - 如果你关心的话。 (根据正则表达式页面:114步骤反对200步骤)
如果您需要两者,出于性能原因,这也可以(根据需要转义"
)
'(?:\\'|[^'])*'|"(?:\\"|[^"])*"
所有这些解决方案都存在腐败输入的小缺陷,如
'Counsel\'s kitchen', 'tes\\t\'
最后一组仍将匹配!
答案 1 :(得分:1)
你能说出你正在使用的Python版本吗?在我的2.7上,似乎已经使用“”“中的转义引用做了正确的事情,因此您可以将数据提取为这样的列表列表:
[re.split("'?,'",t.strip("'")) for t in re.findall("\((.*?)\)",sql)]