python解析sql语句表名_python正则表达式匹配sql语句中的表名
[ string text = "select * from [admin] where aa=1 and cc='b' order by aa desc "; Regex reg = null; reg = new Regex(@"\s+from\s
能够从sql语句中匹配表名,表的简称。使用的是python的正则表达式匹配的,本想做一个和plsql类似的工具,还没搞完整,先记录一下
# -*- coding: UTF-8 -*-
import re
keylist=['ACCESS','ADD','ALL','ALTER','AND','ANY','AS','ASC','AUDIT','BETWEEN','BY','CHAR','CHECK','CLUSTER','COLUMN','COMMENT','COMPRESS','CONNECT','CREATE','CURRENT','DATE','DECIMAL','DEFAULT','DELETE','DESC','DISTINCT','DROP','ELSE','EXCLUSIVE','EXISTS','FILE','FLOAT','FOR','FROM','GRANT','GROUP','HAVING','IDENTIFIED','IMMEDIATE','IN','INCREMENT','INDEX','INITIAL','INSERT','INTEGER','INTERSECT','INTO','IS','LEVEL','LIKE','LOCK','LONG','MAXEXTENTS','MINUS','MLSLABEL','MODE','MODIFY','NOAUDIT','NOCOMPRESS','NOT','NOWAIT','NULL','NUMBER','OF','OFFLINE','ON','ONLINE','OPTION','OR','ORDER','P','CTFREE','PRIOR','PRIVILEGES','PUBLIC','RAW','RENAME','RESOURCE','REVOKE','ROW','ROWID','ROWNUM','ROWS','SELECT','SESSION','SET','SHARE','SIZE','SMALLINT','START','SUCCESSFUL','SYNONYM','SYSDATE','TABLE','THEN','TO','TRIGGER','UID','UNION','UNIQUE','UPDATE','USER','VALIDATE','VALUES','VARCHAR','VARCHAR2','VIEW','WHENEVER','WHERE','WITH']
#sq3string = r"(\b[rRbB])?'''[^'\\]*((\\.|'(?!''))[^'\\]*)*(''')?"
sq3string = r"(\b[rRbB])?'[^'\\]*((\\.|'(?!''))[^'\\]*)*?(')?" #倒数第二个?是为了最小匹配
sqs1 = r"(\b[rRbB])?"
sqs2 = r"A((?!table).)+B" # 匹配排除table
selectmatch = r"(?!')*\bfrom\b\s+\b(?P\w+)\b\s+\b(?P\w+)\b(?!')*" #匹配select语句中的表名和表名的简写
insertmatch = r"(?!')*\binsert\b\s+\binto\b\s+\b(?P\w+)\b\s+\b(?P\w+)\b(?!')*" #匹配insert语句中的表名和表名的简写
updatematch = r"(?!')*\bupdate\b\s+\b(?P\w+)\b\s+\b(?P\w+)(?!')+" #匹配insert语句中的表名和表名的简写
#chars="select 'from tt we ,d f'*,t able from dual T where sfsf"
selectchars = "select *,'select * from tab3 T3 where T3.s' from tab1 T where a='select * from tab2 T2 where T2.s'"
insertchars = "insert into tab1 T1 (as) values (t,2,_)"
updatechars = "update tab1 t set df='update tab2 sdf set mm=1'"
#print(''.join([i+'|' for i in keylist])[0:-1])
##chars = selectchars
##
### 下面是去掉语句中的字符串,因为字符串可能含有sql语句
##sqloutstr = re.finditer(sq3string, chars, re.S)
##slt = [i for i in sqloutstr]
##slt.reverse()
##if sqloutstr:
## for match in slt:
## pl = match.span()
## chars = chars[:pl[0]]+chars[pl[1]:]
##print(chars)
##
##mstr = selectmatch
##prog = re.compile(mstr, re.S|re.IGNORECASE)
##
##m1 = prog.match(chars)
##
##if m1:
## print('m1.string',m1.string)
## print('匹配到:',chars[m1.start():m1.end()])
##m = prog.search(chars)
##if m:
## print('m',m.groupdict().items())
## for key, value in m.groupdict().items():
## print('key, value',key, value)
selectprog = re.compile(selectmatch, re.S|re.IGNORECASE)
updateprog = re.compile(updatematch, re.S|re.IGNORECASE)
inserprog = re.compile(insertmatch, re.S|re.IGNORECASE)
def delSqlStr(sqlstr):
sqloutstr = re.finditer(sq3string, sqlstr, re.S)
slt = [i for i in sqloutstr]
slt.reverse()
if sqloutstr:
for match in slt:
pl = match.span()
sqlstr = sqlstr[:pl[0]]+sqlstr[pl[1]:]
return sqlstr
def getSelectTBN(sqlstr):
""" 返回select语句的 表名,表名简写"""
TabName = None
shortTabName = None
m = selectprog.search(sqlstr)
if m:
for key, value in m.groupdict().items():
if key == 'table_sn':
shortTabName = value
if key == 'table_name':
TabName = value
#print('getSelectTBN TabName=',TabName, 'shortTabName=',shortTabName)
return TabName,shortTabName
def getUpdateTBN(sqlstr):
""" 返回select语句的 表名,表名简写"""
TabName = None
shortTabName = None
m = updateprog.search(sqlstr)
if m:
for key, value in m.groupdict().items():
if key == 'table_sn':
shortTabName = value
if key == 'table_name':
TabName = value
#print('getUpdateTBN TabName=',TabName, 'shortTabName=',shortTabName)
return TabName,shortTabName
def getInsertTBN(sqlstr):
""" 返回select语句的 表名,表名简写"""
TabName = None
shortTabName = None
m = inserprog.search(sqlstr)
if m:
for key, value in m.groupdict().items():
if key == 'table_sn':
shortTabName = value
if key == 'table_name':
TabName = value
#print('getInsertTBN TabName=',TabName, 'shortTabName=',shortTabName)
return TabName,shortTabName
def getTabNameShortName(sqlstr):
tmpsqlstr = delSqlStr(sqlstr)
TabName = None
shortTabName = None
TabName,shortTabName = getSelectTBN(tmpsqlstr)
if TabName:
return TabName,shortTabName
TabName,shortTabName = getUpdateTBN(tmpsqlstr)
if TabName:
return TabName,shortTabName
TabName,shortTabName = getInsertTBN(tmpsqlstr)
if TabName:
return TabName,shortTabName
chars = "select * from tab1 T1 where T1.name='ssd'"
print(chars)
print(getTabNameShortName(chars))
chars = "update Tab2 T id=12,name='xiaoxiao'"
print(chars)
print(getTabNameShortName(chars))
chars = "insert into tab3 t3 values(13,'dada')"
print(chars)
print(getTabNameShortName(chars))
[匹配ip地址的python正则表达式pattern ='^([01]\d\d|2[0-4]\d|25[0-5])\.([01]\d\d|2[0-4]\d|25[0-5])\.([01]\d\d|2[0-4]\d|25[0-5])\.([01]\d\d|2[0-4]\d|25[0-5
[在园子里发现了一棵好菜,索性摘下来收藏。 转自:http://samlin.cnblogs.com/ 作者:Sam Lin 这几天有个项目需要从表的某个字段判断是否存在某些规则的字符串,大概如下
python解析sql语句表名_python正则表达式匹配sql语句中的表名相关推荐
- python re正则提取ip地址_Python正则表达式匹配和提取IP地址
No.1 IPv4 下面是IPv4的IP正则匹配实例: 简单的匹配给定的字符串是否是ip地址 import re if re.match(r"^(?:[0-9]{1,3}\.){3}[0-9 ...
- python re正则提取ip地址_python 正则表达式匹配IP地址
一.实验环境 1.Windows7x64_SP1 2.anaconda2.5.0 + python2.7(anaconda集成,不需单独安装) 3.pyinstaller3.0 二.实验目的 从tex ...
- 【python正则表达式匹配获取文本中的11位手机号码】
[python正则表达式匹配获取文本中的11位手机号码] 文前白话 代码实现 效果 正则知识补充 文前白话 根据需要,匹配一段没有固定格式的文本,识别其中的11位数字作为手机号,如果11位数字后还有数 ...
- python 正则表达式匹配的位置_python正则表达式匹配 模式匹配
Python正则式的基本用法 初学Python,对Python的文字处理能力有很深的印象,除了str对象自带的一些方法外,就是正则表达式这个强大的模块了.但是对于初学者来说,要用好这个功能还是有点难度 ...
- python不包含某字符_python正则表达式匹配不包含某几个字符的字符串方法
python正则表达式匹配不包含某几个字符的字符串方法 一.匹配目标 文件中所有以https?://开头,以.jpg|.png|.jpeg结尾的字符串 二.尝试过程 1) 自然想到正则表达式r'(ht ...
- python sql注入如何防止_Python如何防止sql注入
Python如何防止sql注入.web漏洞之首莫过于sql了,不管使用哪种语言进行web后端开发,只要使用了关系型数据库,可能都会遇到sql注入攻击问题. 那么在Python web开发的过程中sql ...
- python正则匹配ip地址_Python正则表达式匹配ip地址实例
Python正则表达式匹配ip地址实例 更新时间:2014年10月09日 11:22:51 投稿:shichen2014 这篇文章主要介绍了Python正则表达式匹配ip地址实例,通过简单的实例讲述了 ...
- python正则匹配ip地址_Python正则表达式匹配和提取IP地址
Linux No.1 IPv4 下面是IPv4的IP正则匹配实例: 简单的匹配给定的字符串是否是ip地址 import re if re.match(r"^(?:[0-9]{1,3}.){3 ...
- python正则匹配字符串中的数字_Python正则表达式匹配字符串中的数字
1.使用"\d+"匹配全数字 代码: import re zen = "Arizona 479, 501, 870. Carlifornia 209, 213, 650. ...
最新文章
- Rabbitmq后台运行命令
- (1 24) 3 java代码_算24点 java代码
- 单个字段去重并保留其他字段值
- js函数提示 vscode_工欲善其事,必先利其器,VSCode高效插件
- endnote怎么和word关联_endnote x9怎么和word关联?Word中用EndNote X9教程
- oracle01144,ORA-01144
- STM32工作笔记0011---认识跳线帽
- 抓取网址中的信息(需要解码的)
- vue-router 懒加载优化
- html图片鼠标动态效果代码,纯css3实现鼠标经过图片显示描述的动画效果
- sqlite 表与表之间的关系_第33章 Django多表关系之一对一
- 手动安装ojdbc6
- 点歌机显示歌库服务器未能连接,快速解决常见的六种KTV点歌设备突发故障
- python3 输出 26个大小写英文字母
- Vue3.x的安装和初始化
- 1-5 第一个C语言程序
- 关闭“Chromium 未正确关闭”提示
- 多域名同一空间的处理实例附(ASP代码)
- 基于Matlab的三角函数方程组解算方法
- unity 相同材质不同属性怎么合批