python成长技能之正则表达式

文章目录

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


一、认识正则表达式

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

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

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

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

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

举例,使用findall()方法

import restr = "hello,my name is jie"result = re.findall("jie",str)
print(result)

打印结果

['jie']

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

import restr = "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 restr = "hello word my name is jie"
result = re.findall("/n",str)
print(result)

打印结果

[]

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

在这里插入图片描述

  • 匹配0次到无限次
import res = "hello world helloo hell"
print(re.findall('hello*', s))
['hello', 'helloo', 'hell']
  • 匹配一次或多次
import res = "hello world helloo hell"
print(re.findall('hello+', s))
['hello', 'helloo']
  • 匹配零次或一次
import res = "hello world helloo hell"
print(re.findall('hello?', s))
['hello', 'hello', 'hell']
  • 匹配n次
import res = "hello world helloo hell helloo hellooo helloo helloo"
print(re.findall('hello{2}', s))
['helloo', 'helloo', 'helloo', 'helloo', 'helloo']
  • 匹配至少n次
import res = "hello world helloo hell helloo hellooo helloo helloo"
print(re.findall('hello{2,}', s))
['helloo', 'helloo', 'hellooo', 'helloo', 'helloo']
  • 匹配n次以上,m次以下
import res = "hello world helloo hell helloo hellooo helloo helloo"
print(re.findall('hello{2,3}', s))
['helloo', 'helloo', 'hellooo', 'helloo', 'helloo']

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

在这里插入图片描述

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

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

在这里插入图片描述

  • 匹配整个字符串开头
import restr = "hello jiejie"result = re.findall("^he",str)
print(result)
['he']
  • 匹配整个字符串的结尾位置
import restr = "hello jiejie e e e"result = re.findall("e$",str)
print(result)
['e']
  • 匹配单词开头
import restr = "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 retext = "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 retext = "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 retext = "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 retext = '<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 retext = '<div>Hello</div><div>World</div>'
pattern = r'<div>(.*?)</div>'matches = re.findall(pattern, text)
print(matches)  # 输出结果: 
['Hello', 'World']

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Unity图形学之RenderQueue

1.指定物体的渲染顺序 Tags { “Queue” “XXXX” } 取值类型&#xff1a; Background&#xff1a; 对应数值为 1000&#xff0c;用于需要被最先渲染的对象&#xff0c;。 Geometry&#xff1a; 对应数值为 2000, 用于不透明的物体。这个是默认的选项&#xff08;如果不指明…

i春秋-破译(凯撒密码+数字替换单词中的字母)

练习平台地址 竞赛中心 题目描述 题目内容 就是破译&#xff01;&#xff01;&#xff01; 解题 观察到最后一段是四个字母加上{xxxxx}的形式&#xff0c;很像flag&#xff0c;我们猜测要破译的主要是这个片段 大括号依然存在&#xff0c;那么可能是通过凯撒密码来加密的&a…

丹摩征文活动|平台评测与使用体验报告

一、基本信息 目标产品 丹摩智算平台www.damodel.com 体验设备 台式机 体验系统/环境 Windows 10/浏览器 体验时间 2024/11 二、产品信息 产品类型&#xff1a;云计算服务提供商 产品定位&#xff1a;提供AI开发和算力GPU租赁服务的平台。它旨在简化AI开发流程&#…

Stable Diffusion核心网络结构——CLIP Text Encoder

&#x1f33a;系列文章推荐&#x1f33a; 扩散模型系列文章正在持续的更新&#xff0c;更新节奏如下&#xff0c;先更新SD模型讲解&#xff0c;再更新相关的微调方法文章&#xff0c;敬请期待&#xff01;&#xff01;&#xff01;&#xff08;本文及其之前的文章均已更新&…

20241118给荣品PRO-RK3566开发板刷Rockchip原厂的buildroot后使用iperf3打流

20241118给荣品PRO-RK3566开发板刷Rockchip原厂的buildroot后使用iperf3打流 2024/11/18 16:38 缘起&#xff0c;使用荣品的DTS。 Y:\RK3566_RK3568_Linux5.10_V1.2.0\device\rockchip\.chips\rk3566_rk3568\rockchip_rk3566_evb2_lp4x_v10_defconfig 1、指定RK_KERNEL_DTS_NAM…

基于java+SpringBoot+Vue的基于web的智慧社区设计与实现

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven mysql5.7或8.0等等组成&#x…

分析一个库 便于以后的使用 WiFiManager.h 2024/11/18

这一段是开启服务器 的 这些都不是重点 重点是那个R_update ,没猜错的话应该是升级的功能 直接索引到定义看看 ,很明显这里是设置了一个 web 访问地址 那就只有换个思路往后查找 handleUpdate 找到这个函数定义 void WiFiManager::handleUpdate() {#ifdef WM_DEBUG_LEVELDEBUG…

学习笔记024——Ubuntu 安装 Redis遇到相关问题

目录 1、更新APT存储库缓存&#xff1a; 2、apt安装Redis&#xff1a; 3、如何查看检查 Redis版本&#xff1a; 4、配置文件相关设置&#xff1a; 5、重启服务&#xff0c;配置生效&#xff1a; 6、查看服务状态&#xff1a; 1、更新APT存储库缓存&#xff1a; sudo apt…

【MySQL系列】深入理解MySQL中的存储、排序字符集

前言 在创建数据库时&#xff0c;我们经常会需要填写数据库的所用字符集、排序规则&#xff0c;字符集和排序规则是两个非常重要的概念&#xff0c;它们决定了数据库如何存储和比较字符串数据。在 MySQL 中&#xff0c;常用的存储字符集有 utf8、utf8mb4&#xff0c;而排序字符…

tcp 超时计时器

在 TCP&#xff08;传输控制协议&#xff09;中有以下四种重要的计时器&#xff1a; 重传计时器&#xff08;Retransmission Timer&#xff09; 作用&#xff1a;用于处理数据包丢失的情况。当发送方发送一个数据段后&#xff0c;就会启动重传计时器。如果在计时器超时之前没有…

Docker部署ES7.9.3单节点

Elasticsearch&#xff08;简称ES&#xff09;是一个分布式、可扩展、实时的搜索与数据分析引擎&#xff01; Elasticsearch位于Elastic Stack核心&#xff0c;为所有类型的数据提供近乎实时的搜索和分析。无论是结构化或非结构化文本、数字数据还是地理空间数据&#xff0c;El…

ChromeDriver驱动下载地址更新(保持最新最全)

说明&#xff1a; ChromeDriver 是 Selenium WebDriver 用于控制 Chrome 的独立可执行文件。 为了方便下载使用&#xff0c;本文保持ChromeDriver的最新版本更新&#xff0c;并提供115.0.5763.0-133.0.6841.0版本的下载地址&#xff1a; 所有版本和下载地址&#xff1a; &am…

CSS:高级寄巧

精灵图 为什么需要精灵图呢&#xff1f; 一个网页中往往会应用很多小背景图作为修饰&#xff0c;当网页中的图像过多时&#xff0c;服务器就会频繁地接收和发送 请求图片&#xff0c;造成服务器请求压力过大&#xff0c;这将大大降低页面的加载速度。 因此&#xff0c;为了有…

AutosarMCAL开发——基于EB DsAdc驱动

目录 一、旋转变压器与DsAdc原理1.常见电机角度反馈方式2.可变磁阻旋变工作原理3.使用TC3XX EDSADC进行旋变软解码 二、EB配置1.载波输出2.通道配置3.调制器4.滤波链路5.整流6.积分 三、Mcal接口应用1.AUtosar标准API接口2.应用步骤 四、总结 一、旋转变压器与DsAdc原理 1.常见…

web应用安全和信息泄露预防

文章目录 1&#xff1a;spring actuator导致的信息泄露1.1、Endpoint配置启用检测1.2、信息泄露复现1.3、防御 2&#xff1a;服务端口的合理使用3&#xff1a;弱口令&#xff08;密码&#xff09;管理4&#xff1a;服务端攻击4.1、短信业务&#xff0c;文件上传等资源型接口1、…

C语言:链表

链表是一种常见的线性数据结构&#xff0c;其中每个元素&#xff08;称为节点&#xff09;包含两部分&#xff1a;数据和指向下一个节点的指针。链表的主要优点是插入和删除操作的时间复杂度较低&#xff0c;但随机访问的效率不如数组。 1. 链表的基本概念 节点&#xff08;N…

webpack配置

4-3vue-loader测试_哔哩哔哩_bilibili 一.新建文件夹vue_todo&#xff0c;vscode打开 二.ctrl打开终端&#xff0c;输入npm init -y&#xff0c;快速生成一个默认的package.json文件 之后左边出现项目初始化文件package.json 三.接下来需要webpack完成打包&#xff0c;所以安装…

字节跳动辞退103人

大家好&#xff0c;我是程序员面试刷题平台的鸭鸭&#xff01; 在前阵子实习生破坏大模型训练事件之后&#xff0c;字节又上了一次热搜。 鸭鸭吃完瓜&#xff0c;只能说&#xff0c;社会险恶啊同学们&#xff01; 5 号&#xff0c;字节跳动内部发布了年内第四份《企业纪律与职…