在引号之间检索文本,包括转义引号

时间:2014-01-06 09:18:05

标签: python regex string

我正在尝试检索此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');
"""

2 个答案:

答案 0 :(得分:2)

建立@HamZa的建议 当你可以保证单引号时,它更容易在更大的上下文中分组:

'(?:\\'|[^'])*'

否则,如果添加其他组,则必须更新后向引用

这也应该稍快一点,因为它没有前瞻 - 如果你关心的话。 (根据正则表达式页面:114步骤反对200步骤)

如果您需要两者,出于性能原因,这也可以(根据需要转义"

'(?:\\'|[^'])*'|"(?:\\"|[^"])*"

所有这些解决方案都存在腐败输入的小缺陷,如

'Counsel\'s kitchen', 'tes\\t\'

最后一组仍将匹配!

All together

答案 1 :(得分:1)

你能说出你正在使用的Python版本吗?在我的2.7上,似乎已经使用“”“中的转义引用做了正确的事情,因此您可以将数据提取为这样的列表列表:

[re.split("'?,'",t.strip("'")) for t in re.findall("\((.*?)\)",sql)]