pyhton语法 正则表达式

pyhton语法 正则表达式

    • 1.正则表达式介绍
      • 1.1 正则表达式入门
      • 1.2 正则替换
    • 2.正则效验
      • 2.1正则-校验单个字符
      • 2.2正则-校验多个字符
      • 2.3 正则-校验开头和结尾
      • 2.4 正则-校验分组
      • 2.5 正则校验邮箱
      • 2.6正则获取分组后的数据
      • 2.7 引用指定组的内容
    • 总结

1.正则表达式介绍

1.1 正则表达式入门

  • 作用:用于检验数据

  • python中,正则调用;

    • 导包
      • import re
    • 正则匹配效验
      • result = re.match(正则表达式,被检验的字符,扩展选项-区分大小写,空值过滤)
      • result = re.search(正则表达式,被检验的字符,扩展选项-区分大小写,空值过滤)
      • result = re.compile(…).sub(…) 用于做替换
    • 获取匹配到的数据
      • reasult.group()
  • . 代表: 任意的1个字符, \n除外

  • 正则表达式入门

# 导包
import re# 校验字符串是否是 任意字符 + it + 任意字符.
result = re.match('.it.', 'aitb')   # 可以匹配
result = re.match('.it.', 'ait\n')  # 未匹配
result = re.match('.it.', 'ait')    # 未匹配# 获取到匹配的结果.
if result:# 走这里, 有值, 获取到匹配的数据, 打印即可.print(result.group())
else:# 走这里, 没有匹配到数据, 打印即可.print('未匹配到!')
  • 演示 match 和 search 的区别
# 相同点: 都可以做正则校验, 传参都是一样的.
# 不同点: match()是全词匹配, 即: 从左往右依次匹配(不能跳).  search()是分段匹配, 有任意一部分能匹配即可.# 判断字符串中是否有 it + 任意的多个字符
# result = re.match('it.*', 'itabc123!@#')
# result = re.match('it.*', 'itabc')
# result = re.match('it.*', 'it')
# result = re.match('it.*', 'aA12!@#itabc')   # 未匹配result = re.search('it.*', 'itabc123!@#')
result = re.search('it.*', 'itabc')
result = re.search('it.*', 'it')
result = re.search('it.*', 'aA12!@#itabc')   # itabc# 打印匹配到的结果.
if result:# 走这里, 有值, 获取到匹配的数据, 打印即可.print(result.group())
else:# 走这里, 没有匹配到数据, 打印即可.print('未匹配到!')

1.2 正则替换

  • 格式:
import rere.compile(正则规则).sub(新字符串, 旧字符串)      去旧字符串中, 找到符合正则规则的内容, 用新字符串来替换.上述格式的语法糖:re.sub(正则规则, 新字符串, 旧字符串)      去旧字符串中, 找到符合正则规则的内容, 用新字符串来替换.回顾:字符串的 replace()函数, 也是替换的, 但是不支持正则.快捷键: alt + enter: 给出建议的意思.
  • 代码展示
import reif __name__ == '__main__':# 案例1: 把下述的符合正则规则的内容, 用*来替换.# 1. 定义 旧字符串.old_str = '你可以这样: 桀1桀2桀, 哈3哈, 呵A呵, 嘿嘿, 嘻嘻, 略略略, 嘤嘤嘤...'# 2. 定义 正则规则(字符串形式)reg_exp = '桀|哈|呵|嘿|嘻'# 3. 把符合正则规则的内容, 用*来替换.# 分解版写法.# 3.1 获取正则对象.# re_obj = re.compile(reg_exp)# 3.2 具体的替换过程.# result = re_obj.sub('*', old_str)# 合并版写法,         正则规则       新内容     旧内容# result = re.compile(reg_exp).sub('*', old_str)# 上述格式的语法糖, 正则规则   新内容     旧内容result = re.sub(reg_exp, '*', old_str)# 4 打印结果print(result)print('-' * 21)# 案例2: 回顾字符串的replace()函数.s1 = '抽烟只抽煊赫门, 一生只爱一个人. 其他烟: 中华, 煊赫门, 天叶, 煊赫门...'# result = s1.replace('煊赫门', '*')     # 不写次数, 默认替换所有.# result = s1.replace('煊赫门', '*', 1)  # 只替换1次(个)result = s1.replace('煊赫门|中华|天叶', '*')print(f'result:  {result}')

2.正则效验

2.1正则-校验单个字符

  • 规则
 .           代表: 任意的1个字符, \n除外\.          代表: 1个普通的.: 取消.的特殊含义a           代表: 1个字符a[abc]       代表: a, b, c中任意的1个字符,: 要么a, 要么b, 要么c[^abc]      代表: 除了a,b,c外, 任意的1个字符\d          代表: 任意的1个整数, 等价于 [0-9]\D          代表: 任意的1个非整数, 等价于 [^0-9]\w          代表: 非特殊字符,: 大小写英文字符, 数字, _, 汉字\W          代表: 特殊字符,: \w 取反.\s          代表: 空白字符, 例如: 空格, \t...\S          代表: 非空白字符,: \s取反.
  • 代码展示
# 导包
import re# 在main中测试
if __name__ == '__main__':# 演示: .           代表: 任意的1个字符, \n除外result = re.match('it.', 'ita')     # itaresult = re.match('it.', 'it\t')    # it\tresult = re.match('it.', 'it\n')    # 未匹配# 演示: \.          代表: 1个普通的.  即: 取消.的特殊含义# 细节: 为了防止打印异常信息, 你可以写成: r'it\.'  或者 'it\\.'result = re.match('it\\.', 'ita')        # 未匹配result = re.match('it\\.', 'it.')        # it.result = re.match('it\\.', 'it.abc')     # it.# 演示: a           代表: 1个字符aresult = re.match('a', 'abc')            # aresult = re.match('a', 'xyz')            # 未匹配# 演示: [abc]       代表: a, b, c中任意的1个字符, 即: 要么a, 要么b, 要么cresult = re.match('it[abc]', 'itabc')    # itaresult = re.match('it[abc]', 'itbc')     # itbresult = re.match('it[abc]', 'itd')      # 未匹配# 演示: [^abc]      代表: 除了a,b,c外, 任意的1个字符result = re.match('it[^abc]', 'itabc')  # 未匹配result = re.match('it[^abc]', 'itbc')   # 未匹配result = re.match('it[^abc]', 'itd')    # itd# 演示: \d          代表: 任意的1个整数, 等价于 [0-9]result = re.match('hm[0-9]', 'hm1')     # hm1result = re.match('hm[0-9]', 'hm3a')    # hm3result = re.match(r'hm\d', 'hm3a')      # hm3result = re.match(r'hm\d', 'hma')      # 未匹配# 演示: \D          代表: 任意的1个非整数, 等价于 [^0-9]result = re.match(r'hm\D', 'hma')   # hmaresult = re.match(r'hm\D', 'hm3a')  # 未匹配# 演示: \w          代表: 非特殊字符, 即: 大小写英文字符, 数字, _, 汉字result = re.match(r'hm\w', 'hma')  # hmaresult = re.match(r'hm\w', 'hmB')  # hmBresult = re.match(r'hm\w', 'hm1')  # hm1result = re.match(r'hm\w', 'hm_')  # hm_result = re.match(r'hm\w', 'hm!')  # 未匹配# 演示: \W          代表: 特殊字符, 即: \w 取反.result = re.match(r'hm\W', 'hm!')  # hm!result = re.match(r'hm\W', 'hm_')  # 未匹配# 演示: \s          代表: 空白字符, 例如: 空格, \t...result = re.match(r'hm\s', 'hm')    # 未匹配result = re.match(r'hm\s', 'hm ')   # hmresult = re.match(r'hm\s', 'hm\t')  # hmresult = re.match(r'hm\s', 'hm\n')  # hm\nresult = re.match(r'hm\s', 'hma')   # 未匹配# 演示: \S          代表: 非空白字符, 即: \s取反.# 自己测试.# 打印校验到的数据.if result:print(f'匹配到: {result.group()}')else:print('未匹配!')

2.2正则-校验多个字符

  • 规则
?           代表: 前边的内容, 出现0次 或者 1*           代表: 前边的内容, 至少出现0, 至多出现n次(无数次)
+           代表: 前边的内容, 出现1次 或者 多次.
a{n}        代表: a恰好出现n次, 多一次少一次都不行.
a{n,}       代表: a至少出现n次, 至多无所谓.
a{n,m}      代表: a至少出现n次, 至多出现m次, 包括n 和 m
  • 代码展示
# 导包
import re# main中测试
if __name__ == '__main__':# 演示: ?           代表: 前边的内容, 出现0次 或者 1次result = re.match('it.?', 'it')result = re.match('it.?', 'it ')result = re.match('it.?', 'itabcABC')result = re.match('it.?', 'it\nABC')    # it# 演示: *           代表: 前边的内容, 至少出现0次, 至多出现n次(无数次)result = re.match('it[abc]*', 'it\nABC')  # itresult = re.match('it[abc]*', 'itabcABC') # itabcresult = re.match('it[abc]*', 'it ')      # itresult = re.match('it[abc]*', 'it')       # it# 演示: +           代表: 前边的内容, 出现1次 或者 多次.result = re.match('it[abc]+', 'it')   # 未匹配result = re.match('it[abc]+', 'it ')  # 未匹配result = re.match('it[abc]+', 'it\nABC')  # 未匹配result = re.match('it[abc]+', 'itabcABC')  # itabc# 演示: a{n}        代表: a恰好出现n次, 多一次少一次都不行.result = re.match('it[abc]{2}', 'itabcABC')  # itabresult = re.match('it[abc]{2}', 'itacb')     # itacresult = re.match('it[abc]{2}', 'ita')       # 未匹配# 演示: a{n,}       代表: a至少出现n次, 至多无所谓.result = re.match('it[abc]{2,}', 'ita')         # 未匹配result = re.match('it[abc]{2,}', 'itacb')       # itacbresult = re.match('it[abc]{2,}', 'itabcABC')    # itabc# 演示: a{n,m}      代表: a至少出现n次, 至多出现m次, 包括n 和 mresult = re.match('it[abc]{2,3}', 'itabcde')     # itabcresult = re.match('it[abc]{2,3}', 'ita')         # 未匹配# 打印结果.print(f'匹配到: {result.group()}' if result else '未匹配!')

2.3 正则-校验开头和结尾

  • 规则
^       代表: 正则表达式的 开头
$       代表: 正则表达式的 结尾
  • 代码展示
import reif __name__ == '__main__':# 演示: ^       代表: 正则表达式的 开头# 需求: 校验字符串必须以 it 开头.result = re.match(r'it\d', 'it123')      # it1result = re.match(r'it\d', '1it123')     # 未匹配!result = re.search(r'it\d', 'it123')   # it1result = re.search(r'it\d', '1it123')  # it1# ^代表开头, 即: 如下的代码其实是 全词匹配, 必须从字符串的第1个字符开始校验.result = re.search(r'^it\d', '1it123')  # 未匹配!# 演示: $       代表: 正则表达式的 结尾# 需求: 校验字符串必须以 数字 结尾.result = re.match(r'it\d', 'it123a')      # it1result = re.match(r'it\d$', 'it123a')     # 未匹配!# 扩展: 校验手机号.# 规则: 1. 必须以1开头.   2.第2位数字可以是3 ~ 9.  3.必须是纯数字.  4.长度必须是11位.result = re.match(r'^1[3-9]\d{9}$', '13112345678a')result = re.match(r'^1[3-9]\d{9}$', '13112345678')# 打印匹配到的结果.print(result.group()  if result else '未匹配!')

2.4 正则-校验分组

  • 规则
 |           代表: 或者的意思.()          代表: 分组\num        代表: 获取第num组的内容扩展:(?P<分组名>)   设置分组(?P=分组名)    获取指定分组的内容
  • 代码展示
import reif __name__ == '__main__':# 需求1: 在列表中, 打印用户喜欢吃 和 不喜欢吃的水果.# 1. 定义水果列表.fruits = ['apple', 'banana', 'orange', 'pear']# 2. 遍历, 获取每种水果.for fruit in fruits:# 3. 假设用户喜欢吃 香蕉, 梨, 判断即可.result = re.match('banana|pear', fruit)# 4. 打印结果.if result:print(f'喜欢吃: {fruit}')else:print(f'不喜欢吃: {fruit}')

2.5 正则校验邮箱

  • 规则
 |           代表: 或者的意思.()          代表: 分组\num        代表: 获取第num组的内容扩展:(?P<分组名>)   设置分组(?P=分组名)    获取指定分组的内容
  • 代码实现
import reif __name__ == '__main__':# 需求: 匹配出 163, 126, qq等邮箱.# 邮箱规则: 前边是4 ~ 20位的字母, 数字, 下划线 + @标记符 + 域名# 1. 定义邮箱字符串.email_str = 'zhangsan@163com'email_str = 'zhangsan@1634.com'email_str = 'zh@qq.com'email_str = 'zhangsan@163.com'# 2. 定义 校验邮箱的 正则表达式.pattern = r'^[a-zA-Z0-9_]{4,20}@(163|126|qq)\.com$'# 3. 校验邮箱.result = re.match(pattern, email_str)# 4. 打印结果.if result:print(f'匹配到: {result.group()}')     # zhangsan@163.com, 等价于 result.group(0), 即: 获取所有匹配到的数据print(f'匹配到: {result.group(0)}')    # zhangsan@163.com, 效果同上.print(f'匹配到: {result.group(1)}')    # 163else:print('未匹配!')

2.6正则获取分组后的数据

  • 规则
|           代表: 或者的意思.
()          代表: 分组
\num        代表: 获取第num组的内容
扩展:(?P<分组名>)   设置分组(?P=分组名)    获取指定分组的内容
  • 代码实现
import reif __name__ == '__main__':# 需求: 匹配 qq:qq号 这样的数据, 提取出 qq文字 和 qq号码.# 1. 定义字符串.s1 = "qq:1234567"# 2. 匹配数据.result = re.match(r'(qq):(\d{6,11})', s1)# 3. 打印匹配到的数据.if result:print(f'匹配到: {result.group()}')     # qq:1234567print(f'匹配到: {result.group(0)}')    # qq:1234567print(f'匹配到: {result.group(1)}')    # qqprint(f'匹配到: {result.group(2)}')    # 1234567else:print('未匹配!')

2.7 引用指定组的内容

  • 规则
  • 细节:正则默认属于第0组, 之后就按照 左小括号来数, 是第几个, 就是第几组.
 |           代表: 或者的意思.()          代表: 分组\num        代表: 获取第num组的内容扩展:(?P<分组名>)   设置分组名(?P=分组名)    获取指定分组的内容
  • 代码实现
import reif __name__ == '__main__':# 需求1: 正则校验 html标签, 简单版.# 1. 定义html标签字符串.html_str1 = '<html>AI就业21期</html>'# 2. 正则校验.# 假设: 标签规则: 2到4位字母result = re.match('<[a-zA-Z]{2,4}>.*</[a-zA-Z]{2,4}>', html_str1)# 上述格式优化版, 加入: 分组思想.result = re.match(r'<([a-zA-Z]{2,4})>.*</\1>', html_str1)# 3. 打印匹配结果.if result:print(f'匹配到: {result.group()}')else:print('未匹配!')print('-' * 21)# 需求2: 正则校验 html标签, 升级版.# 假设: 外部标签规则 2到4位字母,  内部标签规则: h + 1到6的数字# 1. 定义html标签字符串.html_str2 = '<html><h1>AI就业21期</h1></html>'# 2. 正则校验result = re.match(r'<[a-zA-Z]{2,4}><h[1-6]>.*</h[1-6]></[a-zA-Z]{2,4}>', html_str2)# 加入分组, 优化上述的代码.result = re.match(r'<([a-zA-Z]{2,4})><(h[1-6])>.*</\2></\1>', html_str2)# 扩展: 给分组设置组名.result = re.match(r'<(?P<A>[a-zA-Z]{2,4})><(?P<B>h[1-6])>.*</(?P=B)></(?P=A)>', html_str2)# 3. 打印匹配结果.if result:print(f'匹配到: {result.group()}')else:print('未匹配!')

总结

持续更新中~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/880460.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【LMS调测】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 基本概念 LMS全称为Lite Memory Sanitizer&#xff0c;是一种实时…

建立分支提交代码

git分支 git branch 产看当前分支 git branch -a 查看所有分支 git checkout 分支名 切换分支 git checkout -b 分支名 建立分支&#xff08;仅仅是在本地建立了&#xff0c;并没有关联线上&#xff09; git push --set-upstream origin 分支名 把本地分支推到先线上 gti add …

自定义认证过滤器和自定义授权过滤器

目录 通过数据库动态加载用户信息 具体实现步骤 一.创建数据库 二.编写secutity配置类 三.编写controller 四.编写服务类实现UserDetailsService接口类 五.debug springboot启动类 认证过滤器 SpringSecurity内置认证流程 自定义认证流程 第一步:自定义一个类继承Abstra…

信息技术网络安全政策制定

为什么要制定网络安全政策&#xff1f; 通常&#xff0c;公司并不认为需要制定网络安全政策。现有的政策是为了保护公司的资产&#xff0c;而数据也是一项资产。 网络安全政策的真正必要性很简单&#xff1a;网络安全并不像锁门或不偷公司笔那么简单。在许多情况下&#xff0…

前海石公园的停车点探寻

前海石公园是真的很美&#xff0c;很多看海人&#xff0c;很多钓鱼佬&#xff0c;很多抓螃蟹的人&#xff0c;很多挖沙子的人&#xff0c;很多拍照的人&#xff0c;尤其是没有大太阳的时间段或每天傍晚或每个放假的时候人气超高&#xff0c;故前海石公园停车真的很紧张。由于前…

Unreal Engine 5 C++: 编辑器工具编写入门01(中文解释)

目录 准备工作 1.创建插件 2.修改插件设置 快速资产操作&#xff08;quick asset action) 自定义编辑器功能 0.创建编辑器button&#xff0c;测试debug message功能 大致流程 详细步骤 1.ctrlF5 launch editor 2.创建新的cpp class&#xff0c;derived from AssetAction…

物联网助力智慧交通:优势与前景

智慧交通是当今城市发展的必然趋势&#xff0c;而物联网技术在交通运输领域的应用正是为实现智慧交通建设提供了前所未有的机遇和优势。物联网作为连接和控制物理世界的重要技术手段&#xff0c;在交通领域的应用极大地改善了交通系统的效率、安全性和环保性。 首先&#xff0c…

上海建站提升在线曝光率的关键

在当今数字化时代&#xff0c;企业在线曝光率的高低直接影响到其市场份额和品牌认知度。尤其是在上海这样的大都市&#xff0c;竞争尤为激烈。以下是提升在线曝光率的一些关键策略。 一、优化网站建设 首先&#xff0c;网站是企业在线形象的“门面”。一个设计美观、用户友好的…

STM32嵌入式编程学习到提高:【4】UART串口打印

------------------------------------------------------------------------------------------------------------------------- 工程文件&#xff1a;放在百度云盘里&#xff0c;需要的自行下载&#xff01;&#xff01;&#xff01; 链接: https://pan.baidu.com/s/14gRne…

专业网站建设必备

专业网站建设不仅仅是简单的页面搭建&#xff0c;更是一项综合性的工程&#xff0c;需要结合行业特性、用户体验和技术创新&#xff0c;打造一个符合企业需求、独具特色的线上空间。 第一印象至关重要 一个企业网站就如同公司的数字名片&#xff0c;第一印象往往决定了用户是否…

【LeetCode】每日一题 2024_9_26 数组元素和与数字和的绝对差(模拟)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动&#xff01; 题目&#xff1a;数组元素和与数字和的绝对差 代码与解题思路 func differenceOfSum(nums []int) int {sum1, sum2 : 0, 0for _, v : range nums {sum1 vfor v > 0 {sum2 v%10v / 10}}return sum1-s…

零基础学Servlet

零基础学Servlet 一。介绍&#xff1a; servlet是一种比较古老的编写网站的方式&#xff0c;在2010年之前比较流行&#xff0c;在此之后&#xff0c;有一堆大佬创造了Spring&#xff08;一种框架&#xff09;&#xff0c;Spring是针对Servlet进行进一步封装&#xff0c;从而让…

CANopen开源库canfestival的移植

本文记录将CANopen开源库CANfestival移植到GD32F470单片机的过程。CANopen协议理解请参考博客&#xff1a;CANopen协议的理解-CSDN博客 CANfestival开源库下载链接 CSDN链接&#xff1a; https://download.csdn.net/download/heqiunong/89774627 官网链接&#xff1a;https:/…

黑芝麻A1000-Ubuntu20.04(九)yolov5从训练到板端运行过程详解

宿主机&#xff1a;台式电脑 Ubuntu20.04 开发板&#xff1a;A1000&#xff08;烧录版本SDK v2.3.1.2&#xff09; 模型转换容器&#xff1a;bsnn-tools-container-stk-4.2.0 编译容器&#xff1a;a1000b-sdk-fad-2.3.1.2 yolov5使用工程&#xff1a;黑芝麻根据https://github.…

高性能分布式搜索引擎Elasticsearch详解

♥️作者&#xff1a;小宋1021 &#x1f935;‍♂️个人主页&#xff1a;小宋1021主页 ♥️坚持分析平时学习到的项目以及学习到的软件开发知识&#xff0c;和大家一起努力呀&#xff01;&#xff01;&#xff01; &#x1f388;&#x1f388;加油&#xff01; 加油&#xff01…

[vulnhub] Jarbas-Jenkins

靶机链接 https://www.vulnhub.com/entry/jarbas-1,232/ 主机发现端口扫描 扫描网段存活主机&#xff0c;因为主机是我最后添加的&#xff0c;所以靶机地址是135的 nmap -sP 192.168.75.0/24 // Starting Nmap 7.93 ( https://nmap.org ) at 2024-09-21 14:03 CST Nmap scan…

【Linux】Linux基本命令

目录 文件和目录操作&#xff1a; ls cd pwd cp mv rm mkdir rmdir touch clear history which/whereis 文件查看和编辑&#xff1a; cat less head tail vi 或 vim sz/rz echo 系统信息和管理&#xff1a; su uname hostname df free top ps ki…

2025台球展,2025河南台球及配套设施展览会3月举办

阳春三月&#xff0c;年度招商季&#xff0c;壹肆柒中国国际台球产业博览会助力全国台球企业拓市场&#xff1b; 2025中国&#xff08;郑州&#xff09;国际台球产业博览会&#xff08;壹肆柒台球展&#xff09; The 2025 China (Zhengzhou) International Billiards Industry…

C++:采用模板封装顺序表,栈,队列

1.顺序表&#xff1a; list.hpp #ifndef LIST_HPP #define LIST_HPP #include <iostream>using namespace std;template <class L>class Seqlist { private:L *ptr;L size;L len0;public:void init(L n){//堆区申请空间&#xff08;大小为n&#xff09;this->…

博主回归!数据结构篇启动

目录 1>>闲话 2>>数据结构前言 3>>复杂度的概念 4>>时间复杂度 5>>大O渐进表示法 6>>总结 1>>闲话 家人们好久不见&#xff0c;小编军训终于是结束了&#xff0c;大一事情太多了&#xff0c;这几天没时间健身&#xff0c;没时间…