侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

正则表达式+Python re模块详解

Python  /  管理员 发布于 7年前   527

 正则表达式(Regluar Expressions)又称规则表达式,在代码中常简写为REs,regexes或regexp(regex patterns)。它本质上是一个小巧的、高度专用的编程语言。 通过正则表达式可以对指定的文本实现
匹配测试、内容查找、内容替换、字符串分割 等功能。

re模块介绍

Python中的re模块提供了一个正则表达式引擎接口,它允许我们将正则表达式编译成模式对象,然后通过这些模式对象执行模式匹配搜索和字符串分割、子串替换等操作。re模块为这些操作分别提供了模块级别的函数以及相关类的封装。

正则表达式一些小规则

    ①元字符

  ②量词

③贪婪和非贪婪匹配

    总是在量词范围内尽量多匹配 - 贪婪
    总是在量词范围内尽量少匹配 - 惰性
    .*?x 匹配任意内容任意次数 遇到x就停止
    .+?x 匹配任意内容至少1次 遇到x就停止

    ④转义符问题

    . 有特殊的意义,取消特殊的意义\
    取消一个元字符的特殊意义有两种方法
    在这个元字符前面加 \
     对一部分字符生效,把这个元字符放在字符组里
    [.()+?*]

Python --> re模块

findall
        会优先显示分组内的内容
        *****取消优先显示(?:正则)
search
        只能返回第一个符合条件的项
        得到的结果需要.group取值
        默认获取完整的匹配结果
        通过group(n)取第n个分组中的内容

# search 还是按照完整的正则进行匹配,显示也显示匹配到的第一个内容,但是我们可以通过给group方法传参数# 来获取具体文组中的内容ret = re.search('9(\d)(\d)','19740ash93010uru')print(ret) # 变量 -- > <re.Match object; span=(1, 4), match='974'>if ret:  print(ret.group()) # --> 974  print(ret.group(1)) # --> 7  print(ret.group(2)) # --> 4# findall  # 取所有符合条件的,优先显示分组中的# search 只取第一个符合条件的,没有优先显示这件事儿  # 得到的结果是一个变量    # 变量.group() 的结果 完全和 变量.group(0)的结果一致    # 变量.group(n) 的形式来指定获取第n个分组中匹配到的内容# 加上括号 是为了对真正需要的内容进行提取ret = re.findall('<\w+>(\w+)</\w+>','<h1>askh930s02391j192agsj</h1>')print(ret) # --> ['askh930s02391j192agsj']

    其他的内容在代码中有详细的注释,大家可以复制我的代码一步一步运行然后实验

    以下的内容有:split sub subn math,compile,finditer

# split sub subn math,compile,finditer# splitres = re.split('\d+', "cyx123456cyxx")print(res) # --> ['cyx', 'cyxx']res = re.split('(\d+)', "cyx123456cyxx") # 保留分组print(res) # --> ['cyx', '123456', 'cyxx']# sub 替换res = re.sub('\d+', '我把数字替换了',       "cyx123456cyxxx123456") # 默认全部替换,当然也可以替换一次re.sub('\d+','我把数字替换了',"cyx123456cyxxx123456",1)print(res) # --> cyx我把数字替换了cyxxx我把数字替换了# subn 替换了并显示替换的次数res = re.subn('\d+', '我把数字替换了', "cyx123456cyxxx123456")print(res) # --> ('cyx我把数字替换了cyxxx我把数字替换了', 2)# match 这个就相当与加了个^ (和search差不多) --> 主要用来规定这个字符号必须是什么样的res = re.match('\d+', 'cyx123456cyxxx')print(res) # --> Noneres = re.match('\d+', '123cyx456cyxxx')print(res.group()) # --> 123# compile -- 节省代码的时间的工具# 假如同一个正则表达式要被使用多次# 节省了多次解析同一个正则表达式的时间ret = re.compile("\d+")res = ret.search("cyx12456cyxXX123")print(res.group()) # --> 12456# finditer --> 节省空间ret = re.finditer("\d+", "cyx123456cyxxx125644")for r in ret:  print(r.group()) # --> 123456  # 125644# 怎么又节省时间又节省空间呢?ret = re.compile('\d+')res = ret.finditer("cyx222231fddsf45746sdf2123sdf56456sdf10123sdf123132sdf")for r in res:  print(r.group())"""2222314574621235645610123123132"""# 分组命名(?P<组名>正则) (?P=组名)# 有的时候我们要匹配的内容是包含在不想要的内容之中的,# 只能先把不想要的内容匹配出来,然后再想办法从结果中去掉# 分组命名的用法 (找两个组里面是一样的内容)exp = '<abc>asdasf54545645698asdasd</abc>00545sdfsdf</abd>'ret = re.search('<(?P<tag>\w+)>.*?</(?P=tag)', exp)print(ret) # -- > <re.Match object; span=(0, 33), match='<abc>asdasf54545645698asdasd</abc'># exp2:import reret = re.search('\d(\d)\d(\w+?)(\d)(\w)\d(\d)\d(?P<name1>\w+?)(\d)(\w)\d(\d)\d(?P<name2>\w+?)(\d)(\w)',        '123abc45678agsf_123abc45678agsf123abc45678agsf')print(ret.group('name1')) # -- > agsf_123abcprint(ret.group('name2')) # -- > agsf

今日小思考

    当我们有一个这样的列表:

lis = ['', 'z', 'c', 'asd', 'sdf', '', 'asd']

    那么我们如何将里面的空字符删除呢?

ret = filter(lambda n: n, lis)print(list(ret)) # --> ['z', 'c', 'asd', 'sdf', 'asd']

总结

到此这篇关于正则表达式+Python re模块详解的文章就介绍到这了,更多相关正则表达式 python re模块内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!


  • 上一条:
    python如何生成随机密码
    下一条:
    Python常用的正则表达式处理函数详解
  • 昵称:

    邮箱:

    1条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客