python3正则表达式的几个高级用法

python3正则表达式的几个高级用法

一、 概述
本文举例说明python3正则表达式的一些高级级法,主要是各类分组,可应用于
1、复杂网页文件中的有用数据
例如,采用爬虫技术取得网页后,对网页内任何数据进行提取分析
2、 各类配置文件
可能是属性文件,读取属性文件中的键值对
可能是数据库各类查询的复杂匹配的参数解析,类似mybatis的动态sql语句解析,hibernate动态参数sql分析
二、 理解正则表达式的贪婪与非贪婪
1、 生活中的贪婪与非贪婪
例如公司员工餐厅发小西红柿,每人一次可以领取1—10个
如果有的人每次都领取10个,则这个人属于贪婪,就是在不犯错时,每次取最多
如果有的人每次都领取1个,则这个人属于不贪婪,就是在不犯错时,每次取最少
2、 正则表达式的贪婪与非贪婪定义
只有前面的字符串内容可多可少时,才存在贪婪与非贪婪
1) 贪婪语法
.*,取尽可能多的任意字符
\w+,取尽可能多的任意英文字母与数字一次以上
\d{2,5},尽可能取到2--5个数字字母
\s+,},尽可能取到任意多个空格一次以上
.?,任意字符取0次,或1次,尽可能取1次

2)  非贪婪语法
就是在贪婪定义后面加一个?
.*?,取尽可能少的任意字符,尽可能不取
\w+?,取尽可能少的任意英文字母与数字,尽可能只取1个
\d{2,5},尽可能少数字字母,尽可能只取2个
\s+,},尽可能取到最少空格,尽可能只取1个空格
.??,任意字符取0次,或1次,尽可能取0次

3)  贪婪与贪婪的最终匹配
无论贪婪,还是非贪婪,都要与后面内容继续匹配,才能最终确定本次匹配内容,有时给合后面匹配内容时,两都取值相同

3、 示例分析如下
python语法如下
import re
匹配到的结果列表=re.findall(r’正则字符串’,要匹配的字符串,re.I|re.S)
re.I,表示忽略大小写
re.S,表示忽略回行,所有字符包括回行字符

字符串 贪婪正则 非贪婪正则
www.baidu.com/num 正则:
www\.baidu\.com\/.*
则能匹配到
www.baidu.com/num
有num
正则
www\.baidu\.com\/.*?
则能匹配到
www.baidu.com/
无num
www.baidu.com/num/456 www\.baidu\.com\/.*\/\d+
则能匹配到
www.baidu.com/num/456
www\.baidu\.com\/.*?\/\d+
则能匹配到
www.baidu.com/num/456
此时与贪婪正则匹配相同
一段网页文本,希望能求出每个div的innerHTML
<div>….</div>
<div>….</div>
<div>….</div>
<div>….</div>
正则
<div>.*</div>
则不能匹配出每个<div>标签之间的文本innerText
正则
<div>.*?</div>
则能匹配出每个<div>标签之间的文本innerText

4、示例代码如下

import re
s1=re.findall(r'\D+\d+','abc123456') #结果为:['abc123456']
s2=re.findall(r'\D+\d+?','abc123456') #结果为:['abc1']
s2=re.findall(r'\D+\d*','abc123456') #结果为:['abc123456']
s2=re.findall(r'\D+\d*?','abc123456') #结果为:['abc']
s2=re.findall(r'\D+\d{2,4}','abc123456') #结果为:['abc1234']
s2=re.findall(r'\D+\d{2,4}?','abc123456',re.I) #结果为:['abc12']
s2=re.findall(r'\D+\d?','abc123456',re.I) #结果为:['abc1']
s2=re.findall(r'\D+\d??','abc123456',re.I) #结果为:['abc']

三、 正则表达式的自定义命名分组,(?P)
1、 语法说明
一个正则表达式可以有多个自定义名称的分组,可以能过分组名称提取到匹配的字符串
每一个分组定义是(?P<自定义分组名称>正则字符串)
例如
pattern=r’正则1(?P<组1>组1正则)正则2(?P<组2>组2正则)正则3(?P<组3>组3正则)’

2、 需求如下
这是一段java代码字符串,有下面几种分析需求
1) 需求1,求3个参数,,,,3组实现
a) 每个变量的数据类型
类型名称前后有数量不相同的空格
b) 每个变量名称
变量名称前有数量不相同的空格,后面有等号,等号前后有数量不相同的空格
c) 每个变量的值
值的前后有数量不相同的空格
变量最后一定有分号
2) 需求2,求2个参数, ,,2组实现
a) 每个变量名称
要清除变量前后空格
b) 每个变量的值
要清除值前后空格

3) 需求3,求1个参数,,1组实现
每个变量的值
要清除值前后空格

4) 需求4,求1个参数,,1组实现
每个变量名称
要清除变量名称前后空格

3、 示例代码

str='''
String s1="学习java";
String s2=  " ";
Float   价格=24000.89;
String desc =  "用于找工作技能提升。。。" ;
Integer num  =   12567   ;

'''

import re
#需求1,,分3组:<type>,<name>,<value>,求数据类型,变量名称,变量的值,下面3种求法,结果相同
s1=re.findall(r'(?=String|Float|Integer)(?P<type>\w+)\s+(?P<name>.*?)\s*?=\s*?(?P<value>.*?)\s*?;',str,r
  • 20
    点赞
  • 94
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值