正则表达式--python

news/2024/9/17 7:18:02/ 标签: 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(正则规则, 要被校验的字符串, 扩展选项-例如区分大小写, 空值过滤…)

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

例如

python"># 导包
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(正则规则, 要被校验的字符串, 扩展选项-例如区分大小写, 空值过滤…)

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

例如

python"># 演示 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(正则规则, 新字符串, 旧字符串)

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

例如

python">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取反.

例如

python"># 导包
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

例如

python"># 导包
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、校验开头和结尾

规则

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

例如

python">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组, 之后就按照 左小括号来数, 是第几个, 就是第几组.

例如

python"># |   或的意思
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.ppmy.cn/news/1522650.html

相关文章

springboot、flowable 生成图片发布到Docker乱码问题

flowable自带的方法生成图片时&#xff0c;如设置字体为宋体&#xff0c;则本地测试没有问题&#xff0c;因为windows自带宋体字体库&#xff0c;但是如果发布到Docker&#xff0c;则会出现乱码问题&#xff0c;因为大部分Docker并不包含宋体字体库&#xff1b; 通过Java代码&a…

VitePress 路由重写:自定义目录结构与页面生成

在使用VitePress构建文档网站时&#xff0c;你可能会遇到项目结构复杂的情况&#xff0c;特别是当你的项目是一个包含多个包的monorepo时。为了更好地组织和管理文档&#xff0c;你可能希望将文档文件放置在源代码旁边。然而&#xff0c;VitePress默认会按照特定的目录结构生成…

springboot+mybatis+vue2分页功能开发

前端框架代码 <div class"block"><span class"demonstration">完整功能</span><el-paginationsize-change"handleSizeChange"current-change"handleCurrentChange":current-page"currentPage4":page-s…

Linux多线程——日志任务的线程池实现

文章目录 线程池日志系统完善线程池的实现线程数据线程池的实现完整代码 线程池 线程池可以说是把之前所有的内容全部串联起来的一个项目 我们这里实现一个简单的版本&#xff0c;可以对其进行扩展 线程池也是一种生产者消费者模型 生产者布置任务而消费者处理任务 主要运…

Android 存储之 SharedPreferences 编码模板(工具类编码)

一、SharedPreferences 1、基本介绍 SharedPreferences 是 Android 的一个轻量级存储工具&#xff0c;它采用 key - value 的键值对方式进行存储 它允许保存和读取应用中的基本数据类型&#xff0c;例如&#xff0c;String、int、float、boolean 等 保存共享参数键值对信息的…

html记账本改写:保存数据 localStorage。

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>记账本改写</title><style>table {user-select: none;/* width: 100%; */border-collapse: collapse;}table,th,td {border: 1px solid…

Hive服务部署及Datagrip工具使用

目录 Hive服务部署 Hiveserver2服务 1&#xff09;用户说明 2&#xff09;Hiveserver2部署 &#xff08;1&#xff09;Hadoop端配置 &#xff08;2&#xff09;Hive端配置 3&#xff09;测试 &#xff08;1&#xff09;启动Hiveserver2 &#xff08;2&#xff09;使用命…

tio websocket 客户端 java 代码 工具类

为了更好地组织代码并提高可复用性&#xff0c;我们可以将WebSocket客户端封装成一个工具类。这样可以在多个地方方便地使用WebSocket客户端功能。以下是使用tio库实现的一个WebSocket客户端工具类。 1. 添加依赖 确保项目中添加了tio的依赖。如果使用的是Maven&#xff0c;可以…

第四章 类和对象(2)

4.2 类 类是封装对象的属性和行为的载体&#xff0c;Java中定义类使用class关键字&#xff0c;其语法如下&#xff1a; class 类名称{// 成员变量// 成员方法()} 在Java语言中对象的属性以成员变量的形式存在&#xff0c;对象的方法以成员方法的形式存在。本节将对类与对象进行…

WordPress的安装与简单开发教程

WordPress是目前世界上最受欢迎的开源内容管理系统&#xff08;CMS&#xff09;&#xff0c;它以简便易用、扩展性强和庞大的生态系统著称。通过它&#xff0c;你可以轻松构建博客、企业网站、电子商务平台等多种类型的网站。本文将为你介绍WordPress的安装过程&#xff0c;以及…

如何规避SQL注入漏洞

1 引言 对于很多初学者而言&#xff0c;SQL注入攻击是一种很容易被忽略的安全漏洞&#xff0c;其原理很简单&#xff0c;在日常编码中需要注意规避&#xff0c;养成良好的系统安全意识。 2 原理 SQL注入漏洞产生的根本原因&#xff0c;就是在编码过程中手动拼接sql参数造成的…

IOS 18 发现界面(UITableView)Banner轮播图实现

发现界面完整效果 本文实现Banner轮播图效果 文章基于IOS 17 基于UITabBarController实现首页TabBar继续实现发现界面 实现逻辑 从发现界面的效果图可以看出&#xff0c;发现界面是一个列表&#xff0c;列表包含了不同的Item&#xff0c;我们可以将 banner部分看成是列表的一…

分享基于PDF.JS的移动端PDF阅读器代码

一、前言 在之前的文章《分享基于PDF.js的pdf阅读器代码》里提到了PC端基于PDF.js的阅读器&#xff0c;本文将提供针对移动端的版本。 二、pdfViewer 为了能够直接使用&#xff0c;这里分享一下经过简单修改后能直接使用的pdfViewer代码&#xff1a; pdfViewer代码目录&…

webpack - 五大核心概念和基本配置(打包一个简单HTML页面)

// 五大核心概念 1. entry&#xff08;入口&#xff09; 指示Webpack从哪个文件开始打包2. output&#xff08;输出&#xff09; 指示Webpack打包完的文件输出到哪里去&#xff0c;如何命名等3. loader&#xff08;加载器&#xff09; webpack本身只能处理js&#xff0c;json等…

如何使用 Lua 脚本进行更复杂的网络请求,比如 POST 请求?

在当今的互联网世界中&#xff0c;网络请求是数据交换的基础。无论是在开发Web应用程序、自动化测试还是进行数据抓取&#xff0c;掌握如何发送网络请求是一项基本技能。Lua&#xff0c;作为一种轻量级、高性能的脚本语言&#xff0c;经常被用于这些场景。本文将详细介绍如何使…

C++11新增特性:列表初始化(std::initializer_list) decltype、auto、nullptr、范围for

C11新增特性&#xff1a;列表初始化&#xff08;std::initializer_list&#xff09;& decltype、auto、nullptr、范围for 一、C11新增统一初始化方式1.1 新增方式1.2 初始化容器底层原理&#xff08;std::initializer_list&#xff09; 二、新增声明2.1 decltype2.3 auto &…

uniapp设置微信小程序的交互反馈

链接&#xff1a;uni.showToast(OBJECT) | uni-app官网 (dcloud.net.cn) 设置操作成功的弹窗&#xff1a; title是我们弹窗提示的文字 showToast是我们在加载的时候进入就会弹出的提示。 2.设置失败的提示窗口和标签 icon&#xff1a;error是设置我们失败的logo 设置的文字上…

【JavaScript】LeetCode:16-20

文章目录 16 无重复字符的最长字串17 找到字符串中所有字母异位词18 和为K的子数组19 滑动窗口最大值20 最小覆盖字串 16 无重复字符的最长字串 滑动窗口 哈希表这里用哈希集合Set()实现。左指针i&#xff0c;右指针j&#xff0c;从头遍历数组&#xff0c;若j指针指向的元素不…

浙大数据结构:02-线性结构4 Pop Sequence

这道题我们采用数组来模拟堆栈和队列。 简单说一下大致思路&#xff0c;我们用栈来存1234.....&#xff0c;队列来存输入的一组数据&#xff0c;栈与队列进行匹配&#xff0c;相同就pop 机翻 1、条件准备 stk是栈&#xff0c;que是队列。 tt指向的是栈中下标&#xff0c;fr…

DPDK基础入门(五):报文转发

网络处理模块划分 Packet Input: 接收数据包&#xff0c;将其引入处理流程。Pre-processing: 对数据包进行初步处理&#xff0c;例如基本的检查和标记。Input Classification: 细化数据包的分类&#xff0c;例如基于协议或流进行分流。Ingress Queuing: 将数据包放入队列中进行…