java string 返回匹配正则的字符串的起始位置_python正则表达式--RE模块(转义r 和 \,贪婪模式与非贪婪模式)...

6148d20a70529f57e5711ac2dd0eae38.png

在使用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
# 示例:
>>> 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

正则表达式修饰符 - 可选标志

0370946a54bd60cf3acc19e18a07f1d7.png

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

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'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值