我正在使用一个表示 SQL 参数值的字符串,并且需要将其解析为各个列。这是此类字符串的示例:
values = "( 14587, '290\'960', 'This is, a, difficult,,, string that uses '' \" and even '' \" , '' '', ''. So it definitely needs to be checked for escape characters.', null )"
目标是将这些值提取到列列表中,应对各种挑战:
不同的数据类型:值可以是整数、字符串或空。
转义字符:字符串可能包含转义单引号 (''), 反斜杠或其他特殊字符。
嵌入式分隔符:逗号 可能出现在字符串内部,用逗号进行天真的分割 不可能的。
引号匹配:正确匹配周围的单引号 字符串是必不可少的。
我尝试使用正则表达式来处理引号外的逗号分隔:
import re
values = "( 14587, '290\'960', 'This is, a, difficult,,, string that uses '' \" and even '' \" , '' '', ''. So it definitely needs to be checked for escape characters.', null )"
# Remove outer parentheses and leading/trailing spaces
cleaned_values = values.strip().strip('()')
# Use regular expression to split by commas outside quotes, accounting for escaped quotes
values_list = re.split(r",(?=(?:[^']*'[^']*')*[^']*$)", cleaned_values)
# Strip whitespace from each part
values_list = [v.strip() for v in values_list]
print(cleaned_values)
for value in values_list:
print(value)
这种方法在某种程度上有效,但感觉很脆弱,可能无法处理所有边缘情况,尤其是更复杂的 SQL 字符串。
问题: 将此类 SQL VALUES 字符串解析为各个列的最佳和最可靠的方法是什么,确保以下几点:
专用的 SQL 解析器或其他方法会比正则表达式更合适吗?
您可以搜索:
\s*
;[^'\s]+
;或'(?:[^']|'')*'
\s*(?:,|$)
。像这样:
import re
values = "( 14587, '290\'960', 'This is, a, difficult,,, string that uses '' \" and even '' \" , '' '', ''. So it definitely needs to be checked for escape characters.', null )"
values_list = re.findall(
r"\s*([^'\s]+|'(?:[^']|'')*')\s*(?:,|$)",
values.strip().strip('()'),
)
for value in values_list:
print(value)
哪个输出:
14587
'960'
'This is, a, difficult,,, string that uses '' " and even '' " , '' '', ''. So it definitely needs to be checked for escape characters.'
null