首页 > 其他分享 >正则表达式 re模块

正则表达式 re模块

时间:2023-06-08 19:55:24浏览次数:47  
标签:匹配 正则表达式 res re 模块 print group findall

目录

正则表达式

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑
在python中,如果想使用正则表达式,我们需要借助于re模块

字符组

#字符组中括号内匹配数据都是或的关系,默认匹配顺序是从左至右依次匹配
[0123456789]# 匹配0-9的数字
[0-9]# 匹配0-9的数字
[a-z]  # 匹配a-z之间的任何一个字符
[A-Z]  # 匹配A-Z之间的任何一个字符
[0-9a-xA-X] # 匹配0-9、a-f、A-F

字符

.匹配除换行符以外的任意字符
\d匹配数字 
\w匹配字母或数字或下划线
^匹配字符串的开始
$匹配字符串的结尾
a|b匹配字符a或字符b # a|b|c|d匹配a或者b或者c或者d
()匹配括号内表达式,也表示一个组
[...]匹配中括号字符组内的所有字符
[^...] 取反,匹配中括号以外的所有字符 
\W匹配非数字、字母、下划线
\n匹配换行符
\s匹配任意空格

量词

"""
1. 量词不能单独使用,必须跟在字符后面
2. 量词只会影响左边的一个表达式 (例如ab+ 只会影响b)
3. 量词一定配合表达式使用
4. 没有量词修饰匹配的都是一个字符
正则默认都是贪婪匹配,默认是多次
"""

*   			# 匹配零次或更多次,默认多次
+				# 匹配一次或更多次,默认多次
?				# 匹配零次或一次,默认一次
{n}				# 匹配n次	
{n,}			# 匹配n次或更多次,默认多次
{n,m}			# 匹配n到m次,默认m次

贪婪匹配和非贪婪匹配

正则表达式默认情况都是贪婪匹配

  • 贪婪匹配
    字符串:
        <script>hello</script>
    正则表达式:
        <.*>    
    匹配结果:
        <script>hello</script>
  • 非贪婪匹配
'''取消贪婪匹配,在表达式中加?'''
    字符串:
        <script>hello</script>
    正则表达式:
        <.*?>    
    匹配结果:
        <script>
        </script>

转义符 \

在正则表达式中,有很多有特殊意义的是元字符,比如\n和\s等,如果要在正则中匹配正常的"\n"而不是"换行符"就需要对""进行转义,变成'\'

匹配字符:'\n'
正则:'\\n'  等价于 r'\n'

匹配字符:'\\n'  
正则:'\\\\n ' 等价于 r'\\n'

"""在字符串之前加r,让整个字符串不转义"""

re模块

常用方法

  • findall查找所有符合正则表达式的数据,符合条件的都返回
"""
1. 如果匹配到,返回匹配到的结果,并且是列表形式
2. 匹配不到,返回[],并没有报错
"""
import re#首先导入re
res= re.findall('a','kesain jack aatony')
print(res)   #['a', 'a', 'a', 'a']匹配到就返回匹配到的结果,并且是列表形式

res= re.findall('^a','akesain jack aatony')
print(res)     #['a']

res= re.findall('^a','kesain jack aatony')
print(res)     #[]  #匹配不到,返回[],并没有报错

res= re.findall('^alln$','alln') 精准匹配^和$之间的字符
print(res) #['alln']

res= re.findall('^a$','aaa')
print(res) #[]    #匹配不到,返回[]

res=re.findall('^[1-9]\d{13,16}[0-9x]$','110101198001017032')
print(res)#['110101198001017032']
  • search#查找符合正则条件的字符串,符合条件只返回一个结果
'''
1.如果有匹配结果想查看结果要使用group
2.如果没有匹配到结果就返回none
3.如果没有匹配到还使用了group返回就会报错,此时可以使用try……except捕获异常,或者if……else语句对条件进行判断,根据不同的结果执行不同的代码防止报错

'''
res=re.search('b','kesain jack aatony')
print(res)>>>None #匹配不到,返回none

res=re.search('a','kesain jack aatony')
print(res) #<re.Match object; span=(3, 4), match='a'> 
print(res.group()) #a #想看结果必须使用group取值

res=re.search('b','kesain jack aatony')
try:
    print(res.group())
except Exception:
    print('没有匹配到')#没有匹配到#如果没有匹配到还使用了group返回就会报错,此时可以使用try……except捕获异常防止报错

res=re.search('b','kesain jack aatony')
if res:
	print(res.group())
else:
    print('没有匹配到')#没有匹配到#如果没有匹配到还使用了group返回就会报错,此时还可以使用if……else语句根据条件执行不同的代码来防止报错
  • match#只匹配开头符合正则条件的数据,如果不符合就返回none
'''
1.match默认匹配开头的字符串
2.如果没有匹配到结果就返回none
3.如果有匹配结果想查看结果要使用group
4.如果没有匹配到还使用了group返回就会报错,此时可以使用try……except捕获异常,或者if……else语句对条件进行判断,然后根据不同的结果执行不同的代码防止报错
'''
res =re.match('a','kesain jack aatony')
print(res) #None  #默认匹配开始字母,没有匹配到结果就返回none

res =re.match('k','kesain jack aatony')
print(res)#<re.Match object; span=(0, 1), match='k'>
print(res.group())#k  #有匹配结果想查看结果要使用group

res =re.match('a','kesain jack aatony')
try:
    print(res.group())
except Exception:
    print('没匹配到')#没匹配到

res =re.match('a','kesain jack aatony')
if res:
    print(res.group())
else:
    print('没匹配到') #没匹配到   
  • sub #用于在字符串中使用正则表达式进行替换操作
ret = re.sub('\d', 'H', 'eva3egon4yuan4', 1)#将数字替换成'H',参数1表示只替换1个
print(ret) #evaHegon4yuan4
  • compile#用于将正则表达式编译成模板
obj = re.compile('\d{3}')  #将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字
ret = obj.search('abc123eeee') #正则表达式对象调用search,参数为待匹配的字符串
print(ret.group())  #结果 : 123 

无名分组和有名分组

  • 无名分组

无名分组取值按照索引取值,索引从1开始,第一个括号索引为1,第二个括号索引为2,以此类推

search情况下:
res = re.search('^[1-9](\d{14})(\d{2}[0-9x])?$','110105199812067023')#()为分组
print(res.group()) #110105199812067023

res = re.search('^[1-9](\d{14})(\d{2}[0-9x])?$','110105199812067023')
print(res.group(1)) #10105199812067# 索引(\d{14}),分组取值是按照索引取值,索引从1开始

res = re.search('^[1-9](\d{14})(\d{2}[0-9x])?$','110105199812067023')
print(res.group(2)) #023#索引的分组是(\d{2}[0-9x])
findall情况下
'''findall方法,分组优先展示,取消分组优先展示?:'''
res = re.findall("^[1-9]\d{14}(\d{2}[0-9x])?$",'110105199812067023')
print(res)#['023']#优先打印分组
res1 = re.findall("^[1-9]\d{14}(?:\d{2}[0-9x])?$",'110105199812067023')#?:取消分组优先展示
print(res1)#['110105199812067023']
  • 有名分组

固定格式(?P正则)

res = re.search("^[1-9](?P<bibi>\d{14})(\d{2}[0-9x])?$",'110105199812067023')
print(res.group(1)) #10105199812067#虽然有名了但依然可以用无名分组索引方式取值

res = re.search("^[1-9](?P<bibi>\d{14})(\d{2}[0-9x])?$",'110105199812067023')
print(res.group('bibi')) #10105199812067#有名分组按照名取值
import re
with open('a.txt', 'r', encoding='utf-8') as f:
    data = f.read()

name_list = re.findall('<h2>(.*?)</h2>', data)
# print(name_list)

# 地址
address_list = re.findall("<p class='mapIco'>(.*?)</p>", data)
# print(address_list)

# 邮箱
email_list = re.findall("<p class='mailIco'>(.*?)</p>", data)
# print(email_list)

# 电话
phone_list = re.findall("<p class='telIco'>(.*?)</p>", data)



res=zip(name_list, address_list, email_list, phone_list)
# print(list(res))
ret = list(res)
for t in ret:
    print("""
        公司名称:%s
        公司地址:%s
        公司邮箱:%s
        公司电话:%s
    """ % (t[0], t[1], t[2], t[3]))

标签:匹配,正则表达式,res,re,模块,print,group,findall
From: https://www.cnblogs.com/Super-niu/p/17462455.html

相关文章

  • Java 表单注册常用正则表达式验证工具类
    http://springmvc-springdata.iteye.com/blog/2114555Java表单注册常用正则表达式验证工具类,常用正则表达式大集合。1.电话号码2.邮编3.QQ4.E-mail5.手机号码6.URL7.是否为数字8.是否为中文9.身份证10.域名11.IP。。。。常用验证应有尽有!这的确是您从事web开发......
  • 正则表达式
    正则表达式正则表达式就是用一些特殊的符号去筛选想要的数据,简称正则字符组[0123456789][0-9]\d#匹配0到9之间的数字[a-z]#匹配a-z之间的字母[A-Z]#匹配A-Z之间的字母字符.#匹配除换行符之外的任意字符\w#匹配字母、数字、下划线\W......
  • [ASP.NET Core] 请求大小限制(转载)
    请求大小一般在文件上传的时候会用到,当然也防止传过来的参数过大情况。一、设置请求体的最大值如果不设置请求体大小默认是 30_000_000bytes,大约28.6MB,当超出大小时会出现如下错误:错误:Failedtoreadtherequestform.Requestbodytoolarge.Themaxrequestbodysize......
  • RedisTemplate常用方法总结
    很多公司都将redisTemplate进行了封装,封装成业务所需要的RedisUtil工具类方便进行调用,本篇文章总结了redisTemplate常用的一些方法。Redis常用的数据类型:•String•Hash•List•Set•zSet•SortedsetString类型判断是否有key所对应的值,有则返回true,没有则返回false......
  • 新的权限模型Matrix data access structure介绍
    这是我的第494篇原创文章,写于2023年6月8日。2021年11月2日,PowerApps博客的博文 AnnouncingPublicPreviewformodernizebusinessunits 宣布了ModernizedBusinessUnits开启Publicpreview阶段,到本文写作时,这个Feature已经GeneralAvailable了。相关功能介绍请参考官方文档......
  • Nginx 安装 ModSecurity 模块
    1、安装ModSecuritycd/usr/localgitclonehttps://github.com/SpiderLabs/ModSecurity.gitcdModSecuritygitsubmoduleinitgitsubmoduleupdateshbuild.sh./configuremakemakeinstall2、安装ModSecurity-nginxcd/usr/localgitclonehttps://github.com/SpiderLabs/ModSec......
  • 报错:[Vue warn]: Error in render: "TypeError: Cannot read properties of undefined
    1.错误详情2.错误分析百度此错误发现,很多人可能忘记在main.js中引入store.js并挂载在vue实例上,或者state单词写错了我审查了很多遍代码,依然报错,读取不到state中的数据,后来想到可能是版本的问题此项目是vue2,要使用vuex3才能正常运行,我安装的时候没有指定版本,直接装的是最新的v......
  • java 访问ingress https报错javax.net.ssl.SSLHandshakeException: Received fatal al
    一、报错及部署环境Java程序访问测试域名https方法正常,访问生产域名https域名报错,报错如下javax.net.ssl.SSLHandshakeException:Receivedfatalalert:protocol_version测试环境使用KubeSphereingress生产环境使用阿里云ACK服务的ingress配置二、问题原因客户端......
  • freeswitch透传带SDP的180
     概述freeswitch是一款简单好用的VOIP开源软交换平台。freeswitch对于180/183的消息处理有默认的规则,但是在3GPP的标准中,消息流程会更加复杂,场景更多变。这样就需要我们根据实际环境中的场景定制消息流程。本文只讨论带SDP的183/180消息。环境centos:CentOS release7.0......
  • Python使用os模块创建带时间戳的文件
    直接上源码:importosimporttime#定义函数名:在py文件路径下创建cache的txt文件deftxt(name,text):#os.getcwd()获取当前的工作路径;new=os.getcwd()+'/cache/'#判断当前路径是否存在,没有则创建new文件夹ifnotos.path.exists(new):......