![6148d20a70529f57e5711ac2dd0eae38.png](https://i-blog.csdnimg.cn/blog_migrate/160176c423f9f8b974551de25edcdfa3.jpeg)
在使用Python循环读取sql语句中的表名和列名的过程中,使用到了正则表达式,这里记录下RE模块的基本用法和示例。
正则表达式并不是Python的一部分。正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大。得益于这一点,在提供了正则表达式的语言里,正则表达式的语法都是一样的,区别只在于不同的编程语言实现支持的语法数量不同;但不用担心,不被支持的语法通常是不常用的部分。
Python通过re模块提供对正则表达式的支持,常用的正则表达式函数有re.match(),re.search(),re,findall()。一、基本用法1、re.match函数
re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
函数语法:
re.match(pattern, string, flags=0)
函数参数说明:
![9e6d6593040e53882c0f03533aea3323.png](https://i-blog.csdnimg.cn/blog_migrate/3dc6b4394399264e75db3538373cebce.png)
# 示例:
>>> import re
>>> print(re.match('www', 'www.runoob.com'))
<re.Match object; span=(0, 3), match='www'>
>>> print(re.match('www.runoob', 'www.runoob.com'))
<re.Match object; span=(0, 10), match='www.runoob'>
>>> print(re.match('com', 'www.runoob.com'))
None
我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。
![bfe3443db6e373eab14b09d5255b2d3c.png](https://i-blog.csdnimg.cn/blog_migrate/35640851ed33748ec5b5a78cf71b4c2b.png)
正则表达式修饰符 - 可选标志
![0370946a54bd60cf3acc19e18a07f1d7.png](https://i-blog.csdnimg.cn/blog_migrate/5857c12c7356ed844ad162741330aef3.jpeg)
2、re.search函数
re.search 扫描整个字符串并返回第一个成功的匹配。
函数语法:
re.search(pattern, string,flags=0)
函数参数说明同上。匹配成功re.search方法返回一个匹配的对象,否则返回None。
注意:re.match与re.search的区别:
re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。3、findall函数
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
注意: match 和 search 是匹配一次 findall 匹配所有。
语法格式为:
findall(string[, pos[, endpos]])
参数:
string : 待匹配的字符串。
pos : 可选参数,指定字符串的起始位置,默认为 0。
endpos : 可选参数,指定字符串的结束位置,默认为字符串的长度。二、重要说明:
1、正则表达式特别字符
![f50fa3b56538067051bb5226da980e48.png](https://i-blog.csdnimg.cn/blog_migrate/7538fde1fd5f4709226b35523847f70a.jpeg)
2、关于转义(r 和 )
Python中字符串前面加上 r 表示原生字符串(raw string),与大多数编程语言相同,正则表达式里使用""作为转义字符,这就可能造成反斜杠困扰。
假如你需要匹配文本中的字符"",那么使用编程语言表示的正则表达式里将需要4个反斜杠"":前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。Python里的原生字符串很好地解决了这个问题,这个例子中的正则表达式可以使用r""表示。
同样,匹配一个数字的"d"可以写成r"d"。有了原生字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。3、关于贪婪模式与非贪婪模式
正则表达式通常用于在文本中查找匹配的字符串。Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;非贪婪的则相反,总是尝试匹配尽可能少的字符。
例如:正则表达式"ab*",如果用于查找"abbbc",将找到"abbb"。而如果使用非贪婪的数量词"ab*?",将找到"a"。三、实例:1、runoob案例
line = "Cats are smarter than dogs"
matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)
print(matchObj.group())
print(matchObj.group(1))
print(matchObj.group(2))
正则表达式:
r'(.*) are (.*?) .*'
解析:
首先,这是一个字符串,前面的一个 r 表示字符串为非转义的原始字符串,让编译器忽略反斜杠,也就是忽略转义字符。但是这个字符串里没有反斜杠,所以这个 r 可有可无。
(.*) 第一个匹配分组,.* 代表匹配除换行符之外的所有字符。
(.*?) 第二个匹配分组,.*? 后面多个问号,代表非贪婪模式,也就是说只匹配符合条件的最少字符
后面的一个 .* 没有括号包围,所以不是分组,匹配效果和第一个一样,但是不计入匹配结果中。
matchObj.group() 等同于 matchObj.group(0),表示匹配到的完整文本字符
matchObj.group(1) 得到第一组匹配结果,也就是(.*)匹配到的
matchObj.group(2) 得到第二组匹配结果,也就是(.*?)匹配到的
因为只有匹配结果中只有两组,所以如果填 3 时会报错。2、adventure works cycles案例
需求分析:现有sql建表语句资料一份,需要从中提取N张表的表名。
需求实现:外层使用while循环,逐行读取文本信息。在文本匹配方面,使用re.search在字符串中查找需要的文本,并使用group()匹配分组提取表名。
注意:
在正则表达式中,要匹配 [ ,必须使用 [ ,否则它将具有其他含义。
使用group()进行匹配分组的前提是,需要使用()将查找文本括起来,如 (.*?) 。
这里使用贪婪模式或非贪婪模式没有区别。
>>> str='CREATE TABLE [dbo].[DimAccount]('
>>> seobj = re.search(r"[(.*?)].[(.*?)]",str,re.I)
>>> seobj
<re.Match object; span=(13, 31), match='[dbo].[DimAccount]'>
>>> table_name=seobj.group(2)
>>> table_name
'DimAccount'