正则表达式--python

正则表达式

1、简介

概述

正确的, 符合特定规则的 字符串. 英文名叫: Regular Expression, 简称叫: re, RegExp

作用

主要是校验数据

细节

  • 学正则, 主要是学正则的规则. 即: 哪个符号表示什么含义.

  • 关于正则, 要求很简单, 只要能用规则, 看懂别人写的式子, 且能简单修改即可, 大部分情况下无需你手动编写.

  • 到目前为止, 正则已经经历了N长的时间, 几乎你遇到的绝大多数的正则校验, 前辈们都已经写过了(帮我们写好了).

  • 正则不独属于Python, 例如: Java, C#, JavaScript, Go…等众多的语言都支持, 且: 正则的规则都是一样的.

调用过程

  • 导包

    • import re
  • 正则匹配校验.

    • result = re.match(正则规则, 要被校验的字符串, 扩展选项-例如区分大小写, 空值过滤…) 全词匹配, 从左往右依次匹配
    • result = re.search(正则规则, 要被校验的字符串, 扩展选项-例如区分大小写, 空值过滤…) 分段批次, 任意一段能匹配即可.
    • result = re.compile(…).sub(…) 用于做替换的
  • 获取匹配到的数据.

    • result.group()

2、几种常用方法

(一)、match

格式

result = re.match(正则规则, 要被校验的字符串, 扩展选项-例如区分大小写, 空值过滤…)

全词匹配, 从左往右依次匹配

例如

# 导包
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('未匹配到!')

(二)、search

格式

result = re.search(正则规则, 要被校验的字符串, 扩展选项-例如区分大小写, 空值过滤…)

分段批次, 任意一段能匹配即可

例如

# 演示 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('未匹配到!')

(三)、compile…sub…

格式

re.compile(正则规则).sub(新字符串, 旧字符串)

去旧字符串中, 找到符合正则规则的内容, 用新字符串来替换.

语法糖

re.sub(正则规则, 新字符串, 旧字符串)

去旧字符串中, 找到符合正则规则的内容, 用新字符串来替换.

例如

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}')

3、校验单个字符

规则

.           代表: 任意的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('ho[0-9]', 'ho1')     # ho1result = re.match('ho[0-9]', 'ho3a')    # ho3result = re.match(r'ho\d', 'ho3a')      # ho3result = re.match(r'ho\d', 'hoa')      # 未匹配# 演示: \D          代表: 任意的1个非整数, 等价于 [^0-9]result = re.match(r'ho\D', 'hoa')   # hoaresult = re.match(r'ho\D', 'ho3a')  # 未匹配# 演示: \w          代表: 非特殊字符, 即: 大小写英文字符, 数字, _, 汉字result = re.match(r'ho\w', 'hoa')  # hoaresult = re.match(r'ho\w', 'hoB')  # hoBresult = re.match(r'ho\w', 'ho1')  # ho1result = re.match(r'ho\w', 'ho_')  # ho_result = re.match(r'ho\w', 'ho!')  # 未匹配# 演示: \W          代表: 特殊字符, 即: \w 取反.result = re.match(r'ho\W', 'ho!')  # ho!result = re.match(r'ho\W', 'ho_')  # 未匹配# 演示: \s          代表: 空白字符, 例如: 空格, \t...result = re.match(r'ho\s', 'ho')    # 未匹配result = re.match(r'ho\s', 'ho ')   # horesult = re.match(r'ho\s', 'ho\t')  # horesult = re.match(r'ho\s', 'ho\n')  # ho\nresult = re.match(r'ho\s', 'hoa')   # 未匹配# 演示: \S          代表: 非空白字符, 即: \s取反.result = re.match(r'ho\S', 'ho')  # 未匹配result = re.match(r'ho\S', 'ho ')  # 未匹配result = re.match(r'ho\S', 'ho\t')  # 未匹配result = re.match(r'ho\S', 'ho\n')  # 未匹配result = re.match(r'ho\S', 'hoa')  # hoa# 打印校验到的数据.if result:print(f'匹配到: {result.group()}')else:print('未匹配!')

4、校验多个字符

规则

?           代表: 前边的内容, 出现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 '未匹配!')

5、校验开头和结尾

规则

^       代表: 正则表达式的 开头
$       代表: 正则表达式的 结尾

例如

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 '未匹配!')

6、校验分组

规则

|           代表: 或者的意思.
()          代表: 分组
\num        代表: 获取第num组的内容
(?P<分组名>)   设置分组名
(?P=分组名)    获取指定分组的内容

细节

正则默认属于第0组, 之后就按照 左小括号来数, 是第几个, 就是第几组.

例如

# |   或的意思
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('未匹配!')# ()   分组的意思
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('未匹配!')# \num   获取第几组的内容
# (?P<分组名>)   设置分组名
# (?P=分组名)    获取指定分组的内容
import reif __name__ == '__main__':# 需求1: 正则校验 html标签, 简单版.# 1. 定义html标签字符串.html_str1 = '<html>电子海鸥</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>电子海鸥</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.rhkb.cn/news/419328.html

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

相关文章

Flutter基本组件Text使用

Text是一个文本显示控件&#xff0c;用于在应用程序界面中显示单行或多行文本内容。 Text简单Demo import package:flutter/material.dart;class MyTextDemo extends StatelessWidget {const MyTextDemo({super.key});overrideWidget build(BuildContext context) {return Sca…

Protobuf库的使用

文章目录 Protobuf是什么Protobuf使⽤流程介绍ProtoBuf的使用创建.proto⽂件指定proto3语法package声明符定义消息&#xff08;message&#xff09;编译contacts.proto⽂件命令如下&#xff1a;序列化与反序列化的使⽤ Protobuf是什么 ProtoBuf&#xff08;全称ProtocolBuffer…

【Python基础】Python函数

本文收录于 《Python编程入门》专栏&#xff0c;从零基础开始&#xff0c;分享一些Python编程基础知识&#xff0c;欢迎关注&#xff0c;谢谢&#xff01; 文章目录 一、前言二、函数的定义与调用三、函数参数3.1 位置参数3.2 默认参数3.3 可变数量参数&#xff08;或不定长参数…

若依框架登录鉴权详解(动态路由)

若依框架登录鉴权&#xff1a;1.获取token&#xff08;过期在响应拦截器中实现&#xff09;,2.基于RBAC模型获取用户、角色和权限信息&#xff08;在路由前置守卫&#xff09;&#xff0c;3.根据用户权限动态生成&#xff08;从字符串->组件&#xff0c;根据permission添加动…

【C++进阶】hash表的封装

文章目录 hash表哈希表的关键组成部分哈希表的优缺点优点&#xff1a;缺点&#xff1a; 常见应用场景 开放定址法实现hash表负载因子 (Load Factor)负载因子的意义负载因子的影响再散列 (Rehashing)示例 整体框架insertFinderasehash桶封装框架insertfinderase~HashTable() 总结…

银行结算业务

1.1 银行本票 银行本票是由银行签发的,承诺自己在见票时无条件支付票款给收款人或持票人的业务。银行本票按票面划分为定额本票和不定额本票,按币种划分为人民币银行本票和外币银行本票。人民币银行本票仅在同一交换区域内使用,资金清算利用当地人民银行组织的资金清算形式…

多个vue项目部署到nginx服务器

文章目录 需求一、项目打包1.vue.config.js2.request.js文件3.打包 二、nginx配置 需求 同一个域名安装多个vue项目。 比如&#xff1a;域名为 https://domain.com 后缀。那么通过不同的后缀就能去访问不同的项目地址。 https://domain.com&#xff0c;不加任何后缀&#x…

【第0006页 · 数组】寻找重复数

【前言】本文以及之后的一些题解都会陆续整理到目录中&#xff0c;若想了解全部题解整理&#xff0c;请看这里&#xff1a; 第0006页 寻找重复数 今天想讨论的一道题在 LeetCode 上评论也是颇为“不错”。有一说一&#xff0c;是道好题&#xff0c;不过我们还是得先理解了它才…

微信小程序中如何监听元素进入目标元素

Page({onLoad: function(){// 如果目标节点&#xff08;用选择器 .target-class 指定&#xff09;进入显示区域以下 100px 时&#xff0c;就会触发回调函数。wx.createIntersectionObserver().relativeToViewport({bottom: 100}).observe(.target-class, (res) > {res.inter…

合宙4G模组Air780EX——产品规格书

Air780EX 是合宙通信推出的LTE Cat.1 bis通信模块&#xff1b; Air780EX采用移芯EC618平台&#xff0c;支持LTE 3GPP Rel.13 技术&#xff1b; Air780EX 是4G全网通模块&#xff0c;可适应不同的运营商和产品&#xff0c;确保产品设计的最大灵活性。 其主要特点和优势可以总…

maven配置文件常用模板

注释很详细&#xff0c;直接上代码 项目结构 内容 父项目 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi…

高德地图SDK Android版开发 10 InfoWindow

高德地图SDK Android版开发 10 InfoWindow 前言相关类和方法默认样式Marker类AMap类AMap.OnInfoWindowClickListener 接口 自定义样式(视图)AMap 类AMap.ImageInfoWindowAdapter 接口 自定义样式(Image)AMap.ImageInfoWindowAdapter 接口 示例界面布局MapInfoWindow类常量成员变…

【数学建模国赛思路预约】2024全国大学生数学建模竞赛助攻思路、代码、论文

2024年全国大学生数学建模大赛马上就要开始了&#xff0c;大家有没有准备好呢&#xff0c;今年将会和之前一样&#xff0c;将会在比赛赛中时期为大家提供比赛各题的相关解题思路、可运行代码参考以及成品论文。 一、分享计划表如下所示 1、 赛中分享内容包括&#xff08;2023国…

高并发内存池(二):​整体框架的介绍与ThreadCache的实现

目录 整体框架介绍 ThreadCache的主体框架 自由链表-FreeList 内存对齐-RoundUp 计算桶位置-Index 基础版 进阶版 线程局部存储 __declspec(thread) 关键字 实现线程无锁 申请内存-Allocate 释放内存-Deallocate 从中心缓存中申请内存 整体框架介绍 高并发内存池…

机器学习引领未来:赋能精准高效的图像识别技术革新

图像识别技术近年来取得了显著进展,深刻地改变了各行各业。机器学习,特别是深度学习的突破,推动了这一领域的技术革新。本文将深入探讨机器学习如何赋能图像识别技术,从基础理论到前沿进展,再到实际应用与挑战展望,为您全面呈现这一领域的最新动态和未来趋势。 1. 引言 …

kubernetes集群部署Confluence 7.2.0+mysql 5.7(自测有效)

背景介绍&#xff1a; Confluence是一个专业的企业知识管理与协同软件。使用简单&#xff0c;但它强大的编辑和站点管理特征能够帮助团队成员之间共享信息、文档协作、集体讨论&#xff0c;信息推送。 这里介绍的使用的是Confluence 7.2.0版本的。 一、在kubernetes集群部署 1…

本地零阶提示优化

本文探讨了如何优化大型语言模型&#xff08;LLM&#xff09;中的提示&#xff08;prompt&#xff09;&#xff0c;以更有效地利用这些黑盒模型的能力。传统的优化方法倾向于寻找全局最优解&#xff0c;但在某些情况下这种做法可能表现不佳。通过对提示优化进行深入的研究&…

01 Docker概念和部署

目录 1.1 Docker 概述 1.1.1 Docker 的优势 1.1.2 镜像 1.1.3 容器 1.1.4 仓库 1.2 安装 Docker 1.2.1 配置和安装依赖环境 1.3镜像操作 1.3.1 搜索镜像 1.3.2 获取镜像 1.3.3 查看镜像 1.3.4 给镜像重命名 1.3.5 存储&#xff0c;载入镜像和删除镜像 1.4 Doecker…

汽车功能安全--TC3xx之PBIST、MONBIST

目录 1.PMS 电源监控速览 2.PBIST 3.MONBIST 4.小结 1.PMS 电源监控速览 英飞凌TC3xx芯片的四种硬件机制&#xff0c;分别是&#xff1a; PMS:PBIST: Power Built-in Self Test. MCU:LBIST: Logic Built-in Self Test. PMS:MONBIST: Monitor Built-in Self Test. VMT:MBI…

史上最全的Linux常用命令汇总(超全面!超详细!)收藏这一篇就够了!

command &#xff1a;命令名&#xff0c;相应功能的英文单词或单词的缩写[-options] &#xff1a;选项&#xff0c;可用来对命令进行控制&#xff0c;也可以省略parameter &#xff1a;传给命令的参数&#xff0c;可以是 零个、一个 或者 多个 查阅命令帮助信息 -help 说明&…