python成长技能之正则表达式

文章目录

  • 一、认识正则表达式
  • 二、使用正则表达式匹配单一字符
  • 三、正则表达式之重复出现数量匹配
  • 四、使用正则表达式匹配字符集
  • 五、正则表达式之边界匹配
  • 六、正则表达式之组
  • 七、正则表达式之贪婪与非贪婪


一、认识正则表达式

  • 什么是正则表达式
    正则表达式(英语:Regular Expression,常简写为regex、regexp或RE),又称正则表示式、正则表
    示法、规则表达式、常规表示法,是计算机科学的一个概念
  • 正则表达式的作用
    正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正
    则表达式通常被用来检索、替换那些符合某个模式的文本
  • 正则表达式的特点
    灵活性、逻辑性和功能性非常强;
    可以迅速地用极简单的方式达到字符串的复杂控制

如何在python中使用正则表达式----findall方法

python中,要使用正则表达式,需要导入re模块,基本格式如下:

re.findall(pattern, string, flags=0)

函数参数说明
在这里插入图片描述
flags可选值如下
在这里插入图片描述

举例,使用findall()方法

import re

str = "hello,my name is jie"

result = re.findall("jie",str)
print(result)

打印结果

['jie']

在python中使用正则表达式----match方法
re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none

import re

str = "hello,my name is jie"

# result = re.findall("jie",str)
# print(result)


match = re.match("hello",str)
print(match.group(0))
hello
要获取匹配的结果,可以使用group(n),匹配结果又多个的时候,n从0开始递增
当匹配结果有多个的时候,也可以使用groups()一次性获取所有匹配的结果

re.search方法
re.search 扫描整个字符串并返回第一个成功的匹配

import re 
s = 'hello world hello' 
result = re.search('hello', s) 
print(result.group(0))

二、使用正则表达式匹配单一字符

  • 使用正则,匹配字符串中所有的数字
import re 

str = "12hellowordhello12"

result = re.findall("\d",str)
print(result)

打印结果

['1', '2', '1', '2']
  • 使用正则,匹配字符串中所有的非数字
import re 

str = "12hellowordhello12"

result = re.findall("\D",str)
print(result)

打印结果

['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'd', 'h', 'e', 'l', 'l', 'o']
  • 使用正则匹配换页符
import re 

str = "12hellowordhello12" + chr(12)

result = re.findall("\f",str)
print(result)

打印结果

['\x0c']
  • 使用正则,匹配换行符
import re

str = "hello word my name is jie"
result = re.findall("/n",str)
print(result)

打印结果

[]

三、正则表达式之重复出现数量匹配

在这里插入图片描述

  • 匹配0次到无限次
import re

s = "hello world helloo hell"
print(re.findall('hello*', s))
['hello', 'helloo', 'hell']
  • 匹配一次或多次
import re

s = "hello world helloo hell"
print(re.findall('hello+', s))
['hello', 'helloo']
  • 匹配零次或一次
import re

s = "hello world helloo hell"
print(re.findall('hello?', s))
['hello', 'hello', 'hell']
  • 匹配n次
import re

s = "hello world helloo hell helloo hellooo helloo helloo"
print(re.findall('hello{2}', s))
['helloo', 'helloo', 'helloo', 'helloo', 'helloo']
  • 匹配至少n次
import re

s = "hello world helloo hell helloo hellooo helloo helloo"
print(re.findall('hello{2,}', s))
['helloo', 'helloo', 'hellooo', 'helloo', 'helloo']
  • 匹配n次以上,m次以下
import re

s = "hello world helloo hell helloo hellooo helloo helloo"
print(re.findall('hello{2,3}', s))
['helloo', 'helloo', 'hellooo', 'helloo', 'helloo']

四、使用正则表达式匹配字符集

在这里插入图片描述

  • 如果是连续的范围,可以使用横杠-
import re

str = "110,120,130,230,250,160"
result = re.findall("1[1-9]0",str)
print(result)
['110', '120', '130', '160']
  • 表示不是某范围之内的,可以使用^取反
import re

str = "110,120,130,230,250,160"
result = re.findall("1[^1-9]0",str)
print(result)
[]

五、正则表达式之边界匹配

在这里插入图片描述

  • 匹配整个字符串开头
import re

str = "hello jiejie"

result = re.findall("^he",str)
print(result)
['he']
  • 匹配整个字符串的结尾位置
import re

str = "hello jiejie e e e"

result = re.findall("e$",str)
print(result)
['e']
  • 匹配单词开头
import re

str = "hello jiejie  hel"

result = re.findall(r'\bhe',str)
print(result)
['he', 'he']

六、正则表达式之组

  • 什么是组
将括号:() 之间的表达式定义为“组”(group),并且将匹配这个表达式的字符保存到一个临时区域(一个正则表达式中最多可以保存9个),它们可以用 \1 到\9 的符号来引用
  • 捕获组(Capturing Groups):
    • 使用圆括号 () 定义的组被称为捕获组
    • 捕获组可以捕获匹配的部分,并可以在后续的处理中引用这些捕获的内容
  • 非捕获组(Non-Capturing Groups):
    • 使用 (?:…) 定义的组被称为非捕获组
    • 非捕获组不会捕获匹配的部分,仅用于分组和逻辑处理
  1. 假设我们有一个字符串,包含一些日期格式,如 “2023-10-01”,我们想分别捕获年、月和日
import re

# 捕获组示例
text1 = "Today's date is 2023-10-01."
pattern1 = r'(\d{4})-(\d{2})-(\d{2})'
match1 = re.search(pattern1, text1)
if match1:
    year = match1.group(1)
    month = match1.group(2)
    day = match1.group(3)
    print(f'Year: {year}, Month: {month}, Day: {day}')


# 输出结果
Year: 2023, Month: 10, Day: 01

代码解析

  • text1:输入字符串,包含日期。
  • pattern1:正则表达式模式,用于匹配日期格式。
    • (\d{4}):匹配四位数字(年份),并将其捕获为第一个组。
    • (\d{2}):匹配两位数字(月份),并将其捕获为第二个组。
    • (\d{2}):匹配两位数字(日期),并将其捕获为第三个组。
  • re.search(pattern1, text1):在 text1 中搜索与 pattern1 匹配的第一个子串。
  • match1.group(1):获取第一个捕获组(年份)。
  • match1.group(2):获取第二个捕获组(月份)。
  • match1.group(3):获取第三个捕获组(日期)。
  • print(f’Year: {year}, Month: {month}, Day: {day}'):打印捕获的年、月、日。
  1. 假设我们有一个字符串,包含一些电话号码,格式为 “123-456-7890”,我们想匹配这种格式,但不需要捕获每个部分
import re

text = "Phone number: 123-456-7890."
pattern = r'(?:\d{3}-){2}\d{4}'

match = re.search(pattern, text)
if match:
    print(f'Matched phone number: {match.group(0)}')


# 输出结果
Matched phone number: 123-456-7890
  • text2:输入字符串,包含电话号码。
  • pattern2:正则表达式模式,用于匹配电话号码格式。
    • (?:\d{3}-):匹配三位数字后跟一个连字符,但不捕获这个组(非捕获组)。
    • {2}:前面的非捕获组重复两次。
    • \d{4}:匹配四位数字。
  • re.search(pattern2, text2):在 text2 中搜索与 pattern2 匹配的第一个子串。
  • match2.group(0):获取整个匹配的子串(电话号码)。
  • print(f’Matched phone number: {match2.group(0)}'):打印匹配的电话号码。
  1. 假设我们有一个字符串,包含一些重复的单词,我们想找到这些重复的单词
import re

text = "This is a test test of repeated repeated words words."
pattern = r'\b(\w+)\b\s+\1\b'

matches = re.findall(pattern, text, re.IGNORECASE)
if matches:
    print(f'Repeated words: {matches}')

# 输出结果
Repeated words: ['test', 'repeated', 'words']
  • text3:输入字符串,包含重复的单词。
  • pattern3:正则表达式模式,用于匹配重复的单词。
    • \b:单词边界。
    • (\w+):匹配一个或多个字母或数字,并将其捕获为第一个组。
    • \b:单词边界。
    • \s+:匹配一个或多个空白字符。
    • \1:反向引用第一个捕获组,确保匹配的单词相同。
    • \b:单词边界。
  • re.findall(pattern3, text3, re.IGNORECASE):在 text3 中查找所有与 pattern3 匹配的子串,忽略大小写。
  • matches3:包含所有匹配的重复单词。
  • print(f’Repeated words: {matches3}'):打印所有重复的单词。
  1. 假设我们有一个字符串,包含一些日期格式,如 “2023-10-01”,我们想分别捕获年、月和日,并使用命名组
import re

text = "Today's date is 2023-10-01."
pattern = r'(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})'

match = re.search(pattern, text)
if match:
    year = match.group('year')
    month = match.group('month')
    day = match.group('day')
    print(f'Year: {year}, Month: {month}, Day: {day}')


 # 输出结果
 Year: 2023, Month: 10, Day: 01
  • text4:输入字符串,包含日期。
  • pattern4:正则表达式模式,用于匹配日期格式。
    • (?P\d{4}):匹配四位数字(年份),并将其捕获为名为 year 的组。
    • (?P\d{2}):匹配两位数字(月份),并将其捕获为名为 month 的组。
    • (?P\d{2}):匹配两位数字(日期),并将其捕获为名为 day 的组。
  • re.search(pattern4, text4):在 text4 中搜索与 pattern4 匹配的第一个子串。
  • match4.group(‘year’):获取名为 year 的捕获组。
  • match4.group(‘month’):获取名为 month 的捕获组。
  • match4.group(‘day’):获取名为 day 的捕获组。
  • print(f’Year: {year}, Month: {month}, Day: {day}'):打印捕获的年、月、日。

总结:

  1. 捕获组:使用 () 定义,可以捕获匹配的部分
  2. 非捕获组:使用 (?:…) 定义,仅用于分组和逻辑处理
  3. 反向引用:使用 \n 引用第 n 个捕获组
  4. 命名组:使用 (?P…) 定义,可以按名称引用捕获组

七、正则表达式之贪婪与非贪婪

贪婪匹配

默认情况下,大多数量词都是贪婪的,这意味着它们会尽可能多地匹配字符。例如:

  • *:匹配前面的表达式零次或多次
  • +:匹配前面的表达式一次或多次
  • ?:匹配前面的表达式零次或一次
  • {m,n}:匹配前面的表达式至少 m 次,最多 n 次

假设我们有一个字符串,包含一些 HTML 标签,我们想提取标签内的内容

import re

text = '<div>Hello</div><div>World</div>'
pattern = r'<div>(.*)</div>'

matches = re.findall(pattern, text)
print(matches)  

# 输出结果
['Hello</div><div>World']

在这个例子中,.* 是贪婪的,它会尽可能多地匹配字符,因此匹配结果是从第一个 < div>到最后一个< /div>之间的所有内容

非贪婪匹配

非贪婪匹配(也称为懒惰匹配)是指量词会尽可能少地匹配字符。非贪婪匹配可以通过在量词后面加上 ? 来实现。例如:

  • *?:匹配前面的表达式零次或多次,但尽可能少地匹配
  • +?:匹配前面的表达式一次或多次,但尽可能少地匹配
  • ??:匹配前面的表达式零次或一次,但尽可能少地匹配
  • {m,n}?:匹配前面的表达式至少 m 次,最多 n 次,但尽可能少地匹配
import re

text = '<div>Hello</div><div>World</div>'
pattern = r'<div>(.*?)</div>'

matches = re.findall(pattern, text)
print(matches)  

# 输出结果: 
['Hello', 'World']

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ElasticSearch学习笔记三:基础操作(一)

一、前言 上一篇文章中&#xff0c;我们学习了如何使用Java客户端去连接并且简单的操作ES&#xff0c;今天我们将对ES中的基本操作进行学习&#xff0c;包括索引操作、映射操作、文档操作。 二、索引操作 简单回顾一下索引&#xff0c;ES中的索引就有相同结构的数据的集合&a…

【AIGC】如何使用高价值提示词Prompt提升ChatGPT响应质量

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | 提示词Prompt应用实例 文章目录 &#x1f4af;前言&#x1f4af;提示词英文模板&#x1f4af;提示词中文解析1. 明确需求2. 建议额外角色3. 角色确认与修改4. 逐步完善提示5. 确定参考资料6. 生成和优化提示7. 生成最终响…

通过华为鲲鹏认证发行上市的集成平台产品推荐

华为鲲鹏认证是技术实力与品质的权威象征&#xff0c;代表着产品达到了高标准的要求。从技术层面看&#xff0c;认证确保产品与华为鲲鹏架构深度融合&#xff0c;能充分释放鲲鹏芯片的高性能、低功耗优势&#xff0c;为集成平台的高效运行提供强大动力。在安全方面&#xff0c;…

500左右的骨传导耳机哪个牌子好?用户体验良好的五大骨传导耳机

作为一名拥有十几年从业经验的科技爱好者&#xff0c;我主要想告诉大家一些关于骨传导耳机的知识。其中&#xff0c;要远离所谓的不专业产品&#xff0c;它们的佩戴不适和音质不佳问题高得吓人&#xff0c;尤其是很多宣称能提供舒适佩戴和高音质的产品&#xff0c;超过九成的用…

【MySQL】RedHat8安装mysql9.1

一、下载安装包 下载地址&#xff1a;MySQL Enterprise Edition Downloads | Oracle MySQL :: MySQL Community Downloads 安装包&#xff1a;mysql-enterprise-9.1.0_el8_x86_64_bundle.tar 官方 安装文档&#xff1a;MySQL Enterprise Edition Installation Guide 二、安装…

Java项目实战II基于Java+Spring Boot+MySQL的共享汽车管理系统(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在共享经济…

three.js 对 模型使用 视频进行贴图修改材质

three.js 对 模型使用 视频进行贴图修改材质 https://threehub.cn/#/codeMirror?navigationThreeJS&classifyapplication&idvideoModel import * as THREE from three import { OrbitControls } from three/examples/jsm/controls/OrbitControls.js import { GLTFLoad…

智能指针原理、使用和实现——C++11新特性(三)

目录 一、智能指针的理解 二、智能指针的类型 三、shared_ptr的原理 1.引用计数 2.循环引用问题 3.weak_ptr处理逻辑 四、shared_ptr的实现 五、定制删除器 六、源码 一、智能指针的理解 问题&#xff1a;什么是智能指针&#xff1f;为什么要有智能指针&#xff1f;智…

基于SpringBoot和uniapp开发的医护上门系统上门护理小程序

项目分析 一、市场需求分析 人口老龄化趋势&#xff1a;随着全球及中国人口老龄化的加剧&#xff0c;老年人口数量显著增加&#xff0c;对医疗护理服务的需求也随之增长。老年人由于身体机能下降&#xff0c;更需要便捷、高效的医护服务&#xff0c;而医护上门服务恰好满足了这…

Java——并发工具类库线程安全问题

摘要 本文探讨了Java并发工具类库中的线程安全问题&#xff0c;特别是ThreadLocal导致的用户信息错乱异常场景。文章通过一个Spring Boot Web应用程序示例&#xff0c;展示了在Tomcat线程池环境下&#xff0c;ThreadLocal如何因线程重用而导致异常&#xff0c;并讨论了其他并发…

Java-异常处理机制

Java-异常处理机制 一、异常概述1、异常的抛出机制2、如何对待异常3、异常的体系结构3.1、Throwable3.2、Error和Exception3.3、编译时异常和运行时异常3.4、常见的异常有哪些&#xff1f; 二、异常的处理方式一 try-catch的使用1、过程1&#xff1a;抛2、过程2&#xff1a;抓3…

MySQL深度剖析-索引原理由浅入深

什么是索引&#xff1f; 官方上面说索引是帮助MySQL高效获取数据的数据结构&#xff0c;通俗点的说&#xff0c;数据库索引好比是一本书的目录&#xff0c;可以直接根据页码找到对应的内容&#xff0c;目的就是为了加快数据库的查询速度。 索引是对数据库表中一列或多列的值进…

canva 画图 UI 设计

起因&#xff0c; 目的: 来源: 客户需求。 目的&#xff1a; 用数据讲故事。 数据可以瞎编&#xff0c;图表一定要漂亮。 文件分享地址 读者可以在此文件的基础上&#xff0c;继续编辑。 效果图 过程: 我还是喜欢 canva. figma&#xff0c; 我用的时候&#xff0c;每每都想…

HTTP 缓存策略

文章目录 一、HTTP的缓存的过程是怎样的&#xff1f;二、什么时候触发强缓存或协商缓存强缓存ExpiresCache-Control 协商缓存 三、服务器如何判断资源是否新鲜Last-Modified/If-Modified-SinceETag/If-None-Match 四、整体缓存过程 一、HTTP的缓存的过程是怎样的&#xff1f; …

使用OkHttp进行HTTPS请求的Kotlin实现

OkHttp简介 OkHttp是一个高效的HTTP客户端&#xff0c;它支持同步和异步请求&#xff0c;自动处理重试和失败&#xff0c;支持HTTPS&#xff0c;并且可以轻松地与Kotlin协程集成。OkHttp的设计目标是提供最简洁的API&#xff0c;同时保持高性能和低延迟。 为什么选择OkHttp …

前端学习八股资料CSS(五)

更多详情&#xff1a;爱米的前端小笔记&#xff0c;更多前端内容&#xff0c;等你来看&#xff01;这些都是利用下班时间整理的&#xff0c;整理不易&#xff0c;大家多多&#x1f44d;&#x1f49b;➕&#x1f914;哦&#xff01;你们的支持才是我不断更新的动力&#xff01;找…

5个有效的华为(HUAWEI)手机数据恢复方法

5个有效的手机数据恢复方法 华为智能手机中的数据丢失比许多人认为的更为普遍。发生这种类型的丢失有多种不同的原因&#xff0c;因此数据恢复软件的重要性。您永远不知道您的智能手机何时会在这方面垮台&#xff1b;因此&#xff0c;预防总比哀叹好&#xff0c;这就是为什么众…

数据结构 (1)基本概念和术语

一、基本概念 数据&#xff08;Data&#xff09;&#xff1a; 是对客观事物的符号表示&#xff0c;在计算机科学中通常指计算机程序所处理的各种对象。数据可以是数值、字符、图像、声音等任何形式的信息。数据元素&#xff08;Data Element&#xff09;&#xff1a; 也称为数据…

SpringBoot源码解析(四):解析应用参数args

SpringBoot源码系列文章 SpringBoot源码解析(一)&#xff1a;SpringApplication构造方法 SpringBoot源码解析(二)&#xff1a;引导上下文DefaultBootstrapContext SpringBoot源码解析(三)&#xff1a;启动开始阶段 SpringBoot源码解析(四)&#xff1a;解析应用参数args 目录…

.NET桌面应用架构Demo与实战|WPF+MVVM+EFCore+IOC+DI+Code First+AutoMapper

目录 .NET桌面应用架构Demo与实战|WPFMVVMEFCoreIOCDICode FirstAutoPapper技术栈简述项目地址&#xff1a;功能展示项目结构项目引用1. 新建模型2. Data层&#xff0c;依赖EF Core&#xff0c;实现数据库增删改查3. Bussiness层&#xff0c;实现具体的业务逻辑4. Service层&am…