LVS 开源商城系统 高阶函数 个人收款码 dedecms resultMap iphone xaml matplotlib inheritance networking razor vue优势 网盘源码 js的点击事件 jquery遍历子元素 鼠标进入和离开事件 hadoop组件 android自定义控件 docker启动容器 python练习题 python开发 python教程推荐 python读取字典 javalabel java的包 java重载和重写 java基础学习 java基础课程 圣剑世界 pdf拆分工具 自动喊话器 idataparameter 橄榄山快模 暴力猴插件 免费微信答题制作 ps出血 ps去白底 vs2008中文版下载 燃烧之血十字架
当前位置: 首页 > 学习教程  > python

python re正则新手进阶篇

2021/2/8 12:45:29 文章标签: 测试文章如有侵权请发送至邮箱809451989@qq.com投诉后文章立即删除

前言 在测试开发的脚本中,有很多需要数据是需要正则去取的,新手学习正则表达式,学的效果不是很好,大部分的参考文档写的得繁琐,比较难读,花了两天的时间,完成了自己的笔记整理!记得…

前言

在测试开发的脚本中,有很多需要数据是需要正则去取的,新手学习正则表达式,学的效果不是很好,大部分的参考文档写的得繁琐,比较难读,花了两天的时间,完成了自己的笔记整理!记得动手,你会发现,正则真的是个神奇的工具,现在发现,我以前很多的字符匹配,其实完全可以用一句正则去取,但却写了一堆匹配代码。重点需要操作下进阶篇

基础篇:

常用re函数

re.match

re.match 尝试从字符串的起始位置匹配一个模式,匹配函数
re.match(pattern, string, flags=0)

re.search

re.search() 整个函数进行匹配,返回第一个

re.findal

re.findal 整个函数匹配,返回所有数据

a=re.search('R.+','CRong12')
a.group() #Rong12

 a=re.match('R.+','CRong12')
a.group()  无匹配
re.sub

替换字符串,同replace作用
re.sub的函数原型为:re.sub(pattern, repl, string, count)
参数:
pattern : 正则中的模式字符串。
repl : 替换的字符串,也可为一个函数。
string : 要被查找替换的原始字符串。
count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。

import re

phone = "2004-959-559 # 这是一个电话号码"

删除注释
num = re.sub(r'这.*$', "", phone)
print ("电话号码 : ", num)

移除非数字的内容
num = re.sub(r'\D', "", phone)
print ("电话号码 : ", num)

电话号码 :  2004-959-559 # 
电话号码 :  2004959559

常用正则规则

‘^’ 匹配字符开头
a=re.search('^as','asds')  
a.group()=‘as’  
a=re.search('^s','asds')  
a.group() #会报错,因为没有开头是以a为开头  
'$'匹配字符结尾
 a=re.search('1234g$','yangyang1234g')  #以1234g整个字符串为结尾
‘.’ 默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行
a=re.search('.','fdfd')
 a.group()='f'

a=re.match('.','\nfdfd')
a.group() #会报错 .因为匹配不到。换行符默认不匹配

a=re.match('.','\nfdfd',flags=re.DOTALL) #这样就不会报错了

'*‘匹配’*号前的字符0次或多次
a=re.findall('s*','sssass')  #全部字段匹配
['sss', '', 'ss', '']

a=re.search('sa*','sassass') #匹配到就终止
a.group()='sa'

a=re.match('sa*','sassass')
a.group()='sa'
‘+’ 匹配前一个字符1次或多次
a=re.search('y[a-z]+g','yanxweg12333g')
a.group()=''yanxweg'
‘?’ 匹配前一个字符1次或0次
 a=re.search('aaa?','aalexaaa')
 a.group()=aa
 a=re.search('aaa?','aaalexaaa')
a.group()=aaa

 a=re.search('aaa?','alexaaa')
a.group()=aaa
{n,m}’ 匹配前一个字符n到m次
a=re.findall('aa{1,3}','aaalexaaa')
print a
['aaa', 'aaa']
‘|’ 匹配|左或|右的字符,
 s2=re.findall("abc|ABC","ABCBabcCD")#结果为['ABC', 'abc']   

re.search('(ab){2}\|\|=','fdfdabab||=').group()  #用\表示转义字符
'abab||='

s1=re.findall(r'(http|https):\/\/www\.(.*?)\.(com|cn|org)','http://www.baidu.com')
##结果为[('http', 'baidu', 'com')]
\S 匹配任意非空字符
‘\d’ 匹配数字0-9
‘\D’ 匹配非数字
‘\w’ 匹配[A-Za-z0-9]
‘\W’ 匹配非[A-Za-z0-9]
‘s’ 匹配空白字符、\t、\n、\r

re.search("\s+",“ab\tc1\n3”).group() 结果 ‘\t’

进阶篇

常用的组合:

贪婪模式:

.* 多次匹配任意的字符
\w+ 匹配任意英文字母与数字一次以上
\d+ 匹配任意数字一次以上
\d{2,5}} 取到2--5个数字字母
.? 任意字符取0次,或1次,尽可能取1次

非贪婪语法:

.*? 取尽可能少的任意字符,尽可能不取
\w+? 取尽可能少的任意英文字母与数字,尽可能只取1个
\d+? 尽可能取少,取一个数字
\d{2,5}}? 尽可能取到2个数字
.? 任意字符取0次,或1次,尽可能取1次
?? 取0次
示例:

import re
s1=re.findall(r'\D+\d+','abc123456') #结果为:['abc123456']
s2=re.findall(r'\d\D','abc123456')  #结果为[]
s21=re.findall(r'\D\d','abc123456') #结果为[c1]
s22=re.findall(r'\D\d+','abc123456') #结果为['c123456']
s4=re.findall(r'\D+\d*','abc123456') #结果为:['abc123456']
s5=re.findall(r'\D+\d*?','abc123456') #结果为:['abc']
s6=re.findall(r'\D+\d{2,4}','abc123456') #结果为:['abc1234']
s7=re.findall(r'\D+\d{2,4}?','abc123456',re.I) #结果为:['abc12']
s8=re.findall(r'\D+\d?','abc123456',re.I) #结果为:['abc1']
s3=re.findall(r'\D+\d+?','abc123456') #结果为:['abc1']
s23=re.findall(r'\D+\d','abc123456')#结果为:['abc1']
s9=re.findall(r'\D+\d??','abc123456',re.I) #结果为:['abc']
s10=re.findall(r'\D+','abc123456',re.I) #结果为:['abc']

注意:.*?与.*在分组上的区别

不同:
s1=re.findall(r'http:\/\/www\.(.*)','http://www.baidufd.com') #结果为['baidufd.com']
s1=re.findall(r'http:\/\/www\.(.*?)','http://www.baidufd.com') #结果为[]

相同:
s1=re.findall(r'http:\/\/www\.(.*)\.com','http://www.baidufd.com')#结果为['baidufd.com']
s1=re.findall(r'http:\/\/www\.(.*?)\.com','http://www.baidufd.com')#结果为['baidufd.com']
(?P) 分组匹配

每一个分组定义是(?P<自定义分组名称>正则字符串)
例如
pattern=r’正则1(?P<组1>组1正则)正则2(?P<组2>组2正则)正则3(?P<组3>组3正则)’

 re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})","371481199306143242").groupdict("city") 结果{'province': '3714', 'city': '81', 'birthday': '1993'}

 re.search("(?P<qq>[0-9]{9})(?P<youxiang>@[a-z]{2})","33@qq.com").groupdict()



(?=pattern)

前置肯定分组,表示以。。。开头,不过滤

以下两种方法相同
#查询url是否以http://www.开头
s1=re.findall(r'(?P<name>http:\/\/www\..*)','http://www.baidu.com')
s1=re.findall(r'(?=http:\/\/www\.)(?P<name>.*)','http://www.baidu.com') #结果为“['http://www.baidu.com']”
(?!pattern)

表示不包含。。。开头的其余部分,

#查询url不包含http://开头以外的其余部分,以下两种写法
s1=re.findall(r'(?!http:\/\/)(?P<name>www.*)','http://www.baidu.com') #['www.baidu.com']
s1=re.findall(r'(?!http):\/\/(?P<name>.*)','http://www.baidu.com')  #['www.baidu.com']



#查询所有非数字部分,即前面不包含数字,后面是字母
s1=re.findall(r'(?!\d+)(?P<name>\D+)','123java456oracle367bigdata478') #结果是:['java', 'oracle', 'bigdata']

(?:pattern)

跟(?!pattern)很类似,但(?!pattern) 会将匹配结果传到后面的分组而(?:pattern)则不会,看示例

s1=re.findall(r'(?:http:\/\/)(?P<name>.*)','http://www.baidu.com') #结果为['www.baidu.com']

s1=re.findall(r'(?!http:\/\/)(?P<name>.*)','http://www.baidu.com') #结果为['ttp://www.baidu.com', '']


(?<=pattern)

表示包含以。。。结尾的所有部分

s=re.findall(r'(?P<name>\d+)(?<=\d)','987java678abc891abe2345stu2454dy')#结果是:['987', '678', '891', '2345', '2454']
#下面匹配前面是字母一组,后面包含字母的所有分组
 s=re.findall(r'(?P<name>\D+)(?<=\D)','java678abc891abe2345stu2454dy')#结果是:['java', 'abc', 'abe', 'stu', 'dy']

常见正则案例解析:正则中常见的需要转义的特殊符号有单引号 ‘’ 双引号 " " 大括号(),正则规则里的特殊符号包括+ .等
如下例子:

line='b/xx-xx-admin/src/main/java/cn/com/bmoon/cxxs/admin/service/impl/MeeelServiceImpl.java'
re.findall('b/(\S+)$', line) #取出匹配出b/开头的后面所有非空字符内容

line='@@ -81,6 +81,7 @@ public class WashDataTest {'
re.match('@@ -\d+,\d+ \+(\d+),\d+ @@', line) #\+中的\为转义作用
match.group(1) #取出+81中的81值

line='@RequestMapping("/cxs/admin/qxx/vixx") #\( 转义括号字符'
re.compile(r'\((.*)\)').search(line).group(1)

line=""" value="/xx/mxxers/getMaxxmbersByPxsId",method=RequestMethod.POST
 """
re.search('\"(?P<url>(\w+|/)+)\"',line) #\"转义,(\w+|/)匹配"/左边所有的字符,取出vlaue 的值

line='QxxController.java'
re.search('(\w+).java$', file).group(1)


参考文献:
https://blog.csdn.net/isscollege/article/details/80138158


本文链接: http://www.dtmao.cc/news_show_2000351.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?