Python学习之——正则表达式

Python学习之——正则表达式

  • 参考
  • 常见用法
    • re.match
    • re.search
    • 分组
    • re.sub
    • re.findall
    • 使用编译后的正则表达式
  • 实例

参考

Python3 正则表达式
正则表达式 - 简介

简单使用:python re.match函数的使用
分组捕获:Python正则表达式之re.match()

Python通过re模块提供对正则表达式的支持,常用的正则表达式函数有re.match(),re.search(),re,findall()

常见用法

re.match

re.match(pattern, string, flags=0)
"""
从字符串string的开始位置开始匹配模式pattern,如果不是开始位置匹配成功的话,返回none
Args:pattern: 匹配的正则表达式string: 待匹配的字符串flags:可选标志位,表示匹配模式,常见标志位有:re.I 忽略大小写re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境re.M 多行模式re.S 即为 . 并且包括换行符在内的任意字符(. 不包括换行符)re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库re.X 为了增加可读性,忽略空格和 # 后面的注释
Return:开始位置匹配成功, 返回一个匹配对象re.Match object不是开始位置匹配成功的话,返回None
"""

示例

import redef test_re_match():print('============I am test_re_match============')pattern = r'([0-9.-]+)([%]?)([0-9.]*)'test_str = '45.1%23s'match_obj = re.match(pattern, test_str)match_obj_group = match_obj.group()match_obj_group0 = match_obj.group(0)match_obj_group1 = match_obj.group(1)match_obj_group2 = match_obj.group(2)match_obj_group3 = match_obj.group(3)match_obj_span = match_obj.span()print(f'\
match_obj_group:{match_obj_group}\n\
match_obj_group0:{match_obj_group0}\n\
match_obj_group1:{match_obj_group1}\n\
match_obj_group2:{match_obj_group2}\n\
match_obj_group3:{match_obj_group3}\n\
match_obj_span:{match_obj_span}\n\
===========================================')if __name__ == '__main__':test_re_match()""" 结果
============I am test_re_match============
match_obj_group:45.1%23
match_obj_group0:45.1%23
match_obj_group1:45.1
match_obj_group2:%
match_obj_group3:23
match_obj_span:(0, 7)
===========================================
"""

re.search

search()和match()的区别:搜索的起始位置不同
search(): 从整个字符串中搜索第一个匹配的子串,不限制搜索的起始位置。
match(): 从字符串的开头开始匹配,只在字符串开头找到匹配的子串

re.search(pattern, string, flags=0)
"""
扫描整个字符串并返回第一个成功的匹配。
Args:pattern: 匹配的正则表达式string: 待匹配的字符串flags:可选标志位,表示匹配模式,常见标志位有:
Return:搜索成功,返回第一个成功的匹配对象re.Match object搜索失败,返回None
"""

示例

import redef test_re_search():print('============I am test_re_search============')pattern = r'([0-9.-]+)([%]?)([0-9.]*)'test_str = 'abc45.1%23sdef'match_obj = re.search(pattern, test_str)match_obj_group = match_obj.group()match_obj_group0 = match_obj.group(0)match_obj_group1 = match_obj.group(1)match_obj_group2 = match_obj.group(2)match_obj_group3 = match_obj.group(3)match_obj_span = match_obj.span()print(f'\
match_obj_group:{match_obj_group}\n\
match_obj_group0:{match_obj_group0}\n\
match_obj_group1:{match_obj_group1}\n\
match_obj_group2:{match_obj_group2}\n\
match_obj_group3:{match_obj_group3}\n\
match_obj_span:{match_obj_span}\n\
===========================================')if __name__ == '__main__':test_re_search()
""" 结果
============I am test_re_search============
match_obj_group:45.1%23
match_obj_group0:45.1%23
match_obj_group1:45.1
match_obj_group2:%
match_obj_group3:23
match_obj_span:(3, 10)
===========================================
"""

分组

Python正则表达式之re.match()
在匹配的正则表达式pattern中用小括号()括起来就是一个捕获组, 对于匹配成功后返回的象匹配对象re.Match object,我们可以调用匹配对象re.Match object的group()函数来提取每组匹配到的字符串。

group():返回一个包含所有小组字符串的元组。
group(0):和group()一样,返回一个包含所有小组字符串的元组。
group(1):返回第一个小括号()括起来的捕获组的字符串。
group(2):返回第二个小括号()括起来的捕获组的字符串。
以此类推....

示例

import redef test_re_group():print('============I am test_re_group============')pattern = r'([0-9.-]+)([\+\-\*\/]+)([0-9.-]+)'test_str = 'abc12.2*51.9def'match_obj = re.search(pattern, test_str)match_obj_group = match_obj.group()match_obj_group0 = match_obj.group(0)match_obj_group1 = match_obj.group(1)match_obj_group2 = match_obj.group(2)match_obj_group3 = match_obj.group(3)match_obj_span = match_obj.span()print(f'\
match_obj_group:{match_obj_group}\n\
match_obj_group0:{match_obj_group0}\n\
match_obj_group1:{match_obj_group1}\n\
match_obj_group2:{match_obj_group2}\n\
match_obj_group3:{match_obj_group3}\n\
match_obj_span:{match_obj_span}\n\
===========================================')if __name__ == '__main__':test_re_group()
""" 结果
============I am test_re_group============
match_obj_group:12.2*51.9
match_obj_group0:12.2*51.9
match_obj_group1:12.2
match_obj_group2:*
match_obj_group3:51.9
match_obj_span:(3, 12)
===========================================
"""

re.sub

re.sub(pattern, repl, string, count=0, flags=0)
"""
用于替换字符串中的匹配项
Args:pattern: 匹配的正则表达式repl : 替换的字符串,也可为一个函数。string: 待匹配的字符串count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。flags:可选标志位,表示匹配模式
"""

示例
使用正则表达式来实现将大驼峰命名的字符串转成蛇形命名

import redef camel_to_snake(camel_str: str):"""大驼峰转蛇形"""snake_str = re.sub(r"(?P<key>[A-Z])", r"_\g<key>", camel_str)return snake_str.lower().lstrip('_')def test_re_sub():print('============I am test_re_sub============')temp = 'TestName'after_temp = camel_to_snake(temp)print(f'temp:{temp}, camel_to_snake(temp): {after_temp}')print('===========================================')if __name__ == '__main__':test_re_sub()"""结果
============I am test_re_sub============
temp:TestName, camel_to_snake(temp): test_name
===========================================
"""

re.findall

在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果有多个匹配模式,则返回元组列表,如果没有找到匹配的,则返回空列表。

re.findall(pattern, string, flags=0)
"""
用于搜索字符串string中和正则表达式pattern匹配的所有匹配项
Args:pattern: 匹配的正则表达式string: 待匹配的字符串flags:可选标志位,表示匹配模式
"""

示例

import redef test_re_findall():print('============I am test_re_findall============')test_str = 'abc123 def 456ghi78'pattern1 = r'\d+'result_list1 = re.findall(pattern1, test_str)print(f'result_list1:{result_list1}')# findall中含有分组时pattern2 = r'([a-zA-Z]+)(\d+)'result_list2 = re.findall(pattern2, test_str)print(f'result_list2:{result_list2}')print('===========================================')if __name__ == '__main__':test_re_findall()
""" 结果
============I am test_re_findall============
result_list1:['123', '456', '78']
result_list2:[('abc', '123'), ('ghi', '78')]
===========================================
"""

使用编译后的正则表达式

当我们需要多次使用相同的正则表达式时,可以先对正则表达式进行编译,以提高效率

示例:检查属性命名是否 满足 '字母或者下划线开头"

valid_name_regex = re.compile(r"^[_A-Za-z][_0-9A-Za-z]*$")def check_name_valid(name):"""检查属性命名是否 满足 '字母或者下划线开头""""if valid_name_regex.match(name) is None:print(f'name:{name} is invalid!!!!!!!')return Falseelse:print(f'name:{name} is valid!!!!!!!')return Truedef test_re_compile():print('============I am test_re_compile============')property_names = ['name', '_age', '12', "a12"]for property_name in property_names:check_name_valid(property_name)print('===========================================')if __name__ == '__main__':test_re_compile()"""结果
============I am test_re_compile============
name:name is valid!!!!!!!
name:_age is valid!!!!!!!
name:12 is invalid!!!!!!!
name:a12 is valid!!!!!!!
===========================================
"""

实例

1.匹配中文字符串并替换

def test_replace_chinese_word():test_str_list = ["12'你好'3'世界'", 'abc', 'c"真的吗"ab']pattern1 = r'(\')(.*?)(\')'pattern2 = r'(\")(.*?)(\")'for index, test_str in enumerate(test_str_list):ret = []ret.extend(re.findall(pattern1, test_str))ret.extend(re.findall(pattern2, test_str))replace_test_str = test_strfor pre, content, post in ret:if any(['\u4e00' <= char <= '\u9fff' for char in content]):print(f'pre:{pre}, content:{content}, post:{post}')replace_test_str = replace_test_str.replace(f'{pre}{content}{post}', f'ZH_CN({pre}{content}{post})')test_str_list[index] = replace_test_strprint(f'test_str_list:{test_str_list}')print('===========================================')"""结果
===========================================
pre:', content:你好, post:'
pre:', content:世界, post:'
pre:", content:真的吗, post:"
test_str_list:["12ZH_CN('你好')3ZH_CN('世界')", 'abc', 'cZH_CN("真的吗")ab']
===========================================
"""

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

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

相关文章

2023.11.18html中如何使用input/button进行网页跳转

2023.11.18html中如何使用input/button进行网页跳转 在做网页时有时会用元素&#xff0c;有时会用元素进行form表单操作或者网页跳转&#xff0c;但是用bootstrap时两种元素会出现不同的样式&#xff0c;为了样式一致&#xff0c;有时需要使用这两种元素相互实现其常用功能。 …

大数据学习(22)-spark

&&大数据学习&& &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 承认自己的无知&#xff0c;乃是开启智慧的大门 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一下博主哦&#x1f91…

详解自动化测试之 Selenium

目录 1. 什么是自动化 2.自动化测试的分类 3. selenium&#xff08;web 自动化测试工具&#xff09; 1&#xff09;选择 selenium 的原因 2&#xff09;环境部署 3&#xff09;什么是驱动&#xff1f; 4. 一个简单的自动化例子 5.selenium 常用方法 5.1 查找页面元素&…

基于SSM的北海旅游网站设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

nodejs微信小程序-实验室上机管理系统的设计与实现-安卓-python-PHP-计算机毕业设计

用户&#xff1a;管理员、教师、学生 基础功能&#xff1a;管理课表、管理机房情况、预约机房预约&#xff1b;权限不同&#xff0c;预约类型不同&#xff0c;教师可选课堂预约和个人&#xff1b;课堂预约。 目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 …

2023.11.18 每日一题(AI自生成应用)【C++】【Python】【Java】【Go】 动态时间序列分析

目录 一、编程挑战&#xff1a;动态时间序列分析 实际应用&#xff1a; 实现提示&#xff1a; 二、实现 1. C 2. Python 3. JAVA 4. Go 一、编程挑战&#xff1a;动态时间序列分析 问题描述&#xff1a; 假设你是一名软件工程师&#xff0c;需要开发一个应用来分析和预…

asp.net心理健康管理系统VS开发sqlserver数据库web结构c#编程计算机网页项目

一、源码特点 asp.net 心理健康管理系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 系统视频链接 https://www.bilibili.com/video/BV19w411H7P4/ 二、功能介绍 本系统使用Microsoft Visual Studio…

初识Linux:目录的创建销毁

目录 ​编辑 提示&#xff1a;以下指令均在Xshell 7 中进行 零、桌面的本质 &#x1f4bb; 扩展&#x1f387;&#xff1a; 一、cd指令&#xff1a; 1、cd - &#xff1a; 2、cd ~&#xff1a; 重命名命令&#xff1a;alias 二、stat指令 冷知识&#xff1a; 如果…

SpringCloud总结

注&#xff1a;本文并不涉及具体功能是怎么实现的&#xff0c;而只是微服务技术栈的整体总结和理解。 目录 一.基础概念--认识微服务 1.单体架构 2.分布式架构 3.微服务 4.SpringCloud 二.服务的拆分原则 三.RestTemplate--实现不同服务之间的通信与远程调用 四.Eurek…

代码随想录算法训练营第二十八天| 78 子集 90 子集|| 93 复原IP地址

78 子集 由题意可知数组中的元素互不相同&#xff0c;所以在dfs中我们可以将当前的path直接加入到res中。 class Solution {List<List<Integer>>res new ArrayList<>();List<Integer>path new LinkedList<>();public List<List<Integer…

系列一、JVM概述

一、概述 1.1、Java发展中的重大事件 1.2、虚拟机 vs Java虚拟机 1.2.1、虚拟机 1.2.2、Java虚拟机 1.2.3、Java虚拟机的作用 Java虚拟机是二进制字节码的运行环境&#xff0c;负责装载字节码到其内部&#xff0c;解释/编译为对应平台上的机器指令指令。每一条Java指令&#…

鸿蒙:使用Stack、ContentTable、Flex等组件和布局实现一个显示界面

效果展示 一.概述 跟随官网继续HarmonyOS学习 本篇博文实现一个食物详情页的开发Demo 通过这个开发过程学习如何使用容器组件Stack、Flex和基本组件Image、Text&#xff0c;构建用户自定义组件&#xff0c;完成图文并茂的食物介绍 二.构建Stack布局 1.食物名称 创建Stack…

音视频项目—基于FFmpeg和SDL的音视频播放器解析(十四)

介绍 在本系列&#xff0c;我打算花大篇幅讲解我的 gitee 项目音视频播放器&#xff0c;在这个项目&#xff0c;您可以学到音视频解封装&#xff0c;解码&#xff0c;SDL渲染相关的知识。您对源代码感兴趣的话&#xff0c;请查看基于FFmpeg和SDL的音视频播放器 如果您不理解本…

【Dubbo】Dubbo负载均衡实现解析

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;2022年度博客之星全国TOP3&#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化&#xff0c;文章内容兼具广度、深度、大厂技术方案&#xff0c;对待技术喜欢推理加验证&#xff0c;就职于…

Android 13 - Media框架(14)- OpenMax(二)

这一节我们将来解析 media.codec 这个 HIDL service 究竟提供了什么服务&#xff0c;服务是如何启动的。 1、main 函数 我们先来看 frameworks/av/services/mediacodec/main_codecservice.cpp&#xff1a; int main(int argc __unused, char** argv) {strcpy(argv[0], "…

广州华锐互动VRAR:利用VR开展刑事案件公安取证培训,沉浸式体验提升实战能力

随着科技的飞速发展&#xff0c;虚拟现实(VR)技术为我们的生活和工作带来了前所未有的便利。近年来&#xff0c;VR技术在刑事案件公安取证培训中的应用逐渐显现出其独特优势。通过模拟真实的犯罪现场&#xff0c;VR技术为学员提供了沉浸式的体验&#xff0c;使他们在安全的环境…

WebSocket协议详解

前言 WebSocket协议是一种在单个TCP连接上进行全双工通信的应用层协议&#xff0c;位于OSI模型的应用层。它允许服务器主动向客户端推送信息&#xff0c;也可以允许客户端主动向服务器发送信息。WebSocket协议的出现主要是为了解决基于HTTP/1.x的Web应用无法实现服务端向客户端…

java文件压缩加密,使用流的方式

使用net.lingala.zip4j来进行文件加密压缩。 添加依赖net.lingala.zip4j包依赖&#xff0c;这里使用的是最新的包2.11.5版本。 <dependency><groupId>net.lingala.zip4j</groupId><artifactId>zip4j</artifactId><version>${zip4j.versi…

微服务调用链路追踪

概述 本文介绍微服务调用链路追踪&#xff0c;涉及技术有&#xff1a;sleuth和zipkin。sleuth负责追踪调用链路数据&#xff0c;zipkin负责调用链路数据可视化展现。 本文的操作是在 服务网关实践 的基础上进行。 环境说明 jdk1.8 maven3.6.3 mysql8 spring cloud2021.0.8 …

【Python仿真】基于EKF的传感器融合定位

基于EKF的传感器融合定位&#xff08;Python仿真&#xff09; 简述1. 背景介绍1.1. EKF扩展卡尔曼滤波1.1.1.概念1.1.2. 扩展卡尔曼滤波的主要步骤如下&#xff1a;1.1.3. 优、缺点 1.2. 航位推算1.3. 目前航位算法的使用通常与卡尔曼滤波相结合使用2. 分段代码 2.1. 导入需要的…