Python SQLite在用户定义的函数中删除/转义正则表达式模式的一部分

时间:2016-10-13 16:38:47

标签: python sqlite

我在python sqlite3中为正则表达式做了一个简单的替换实现:

import sqlite3, re

db = sqlite3.connect(':memory:')
c = db.cursor()
c.executescript("""
create table t2 (n REAL, v TEXT, t TEXT);
insert into t2 VALUES (6, "F", "ef");
insert into t2 VALUES (1, "A", "aa");
insert into t2 VALUES (2, "B", "be");
insert into t2 VALUES (4, "D", "de");
insert into t2 VALUES (5, "E", "ee");
insert into t2 VALUES (3, "C", "ze");
    """);
db.commit()

def preg_replace(string, pattern, replace):
    return re.sub(pattern, replace, string)

db.create_function('replace',1,preg_replace)

c = db.cursor()
# This does not do anything
c.execute("UPDATE t2 SET t=replace(t,?,?)",('e$','ee'))
db.commit()

c = db.cursor()
c.execute("select * from t2")
print c.fetchall()

// This makes 'be' to 'bee'
print preg_replace("be","e$","ee")

我现在的问题是我的UPDATE命令不会替换表条目末尾的'e' 如果我只使用'e'作为模式,它就可以正常工作('be'最终成为'bee') 如果我手动将表格中的“be”更改为“be $”,则会将其修改为“bee”。

但是,如果我直接使用preg_replace函数,我可以替换字符串末尾的'e'。

我不明白为什么。当我的用户定义函数的输入转到sqlite时,是否有一些字符串转义?非常感谢。

PS:运行Python 2.7.3

1 个答案:

答案 0 :(得分:0)

您必须告诉create_function()该函数有多少参数。

如果SQL使用一个参数调用preg_replace,则将使用replace()