当前位置: 首页 > news >正文

python 正则匹配png_Python正则表达式之初始篇:字符匹配

096e686a6815946f625e10a5dacb830b.png

正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。

Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。

re 模块使 Python 语言拥有全部的正则表达式功能。

本章节主要介绍Python中常用的正则表达式模式与实例。

1. 正则表达式模式

模式字符串使用特殊的语法来表示一个正则表达式:

字母和数字表示他们自身。一个正则表达式模式中的字母和数字匹配同样的字符串。

多数字母和数字前加一个反斜杠时会拥有不同的含义。

标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。

1.1 "^"

"^d" 代表的意思是以d元素开头的任意一个字符串,也就是说只要是以d开头的字符串,后面的元素不论是什么,都是符合规则的,总之必须要以d开头。

“.” 较为常用,其代表的意思是任意字符,其表示的范围非常广,可以接任意字符,不论是中英文,还是下划线之类的特殊字符,都是可以代表的。举个栗子,正则表达式“^d.”就是代表以d开头的字符串,b后边接任意字符都可以。

“*” 也十分常用,其代表的意思是前面的字符可以重复任意多遍,可以是0次,1次,2次等任意多次。

以下为第一个实例,匹配的正则表达式"^z.*" z开头的后面接任意多任意类型的字母数字字符

cf07595b925663b0a57286acf5103750.png

如上图所示,该正则表达式能够顺利匹配得到string中某部分。

1.2 "$"

“$” 代表的意思是结尾字符。举个栗子,正则表达式“3$”,表示匹配以3为结尾的字符串。代码演示如下图所示。

看以下示例,很好理解,两个正则表达式分别匹配0结尾和2结尾的实例,结果当然匹配不到2结尾的字符串。因为string结尾是0。

94273b7ae77ec08182bb5274bf01fe7f.png

1.3 "?"

贪婪匹配:正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配。

非贪婪匹配:就是匹配到结果就好。

首先看一个‘贪婪’的例子:

adfb3a94c8fd47f84fdea0eb5e49c88d.png

在这次贪婪模式的匹配下,匹配的是 "yes" and i say "no",因为默认为贪婪匹配,所以选取了最长的部分。

其次观察一下如果是‘非贪婪’的例子。

124fd3613ce5db64aa3bf039c449fb60.png

显然,加入模式字符“?”之后,进入了非贪婪模式,而不会选取最长的那一段。

为了加深理解,再来看一个贪婪与非贪婪的实例。(d+表示单个以及多个数字)

ed839adfd510e5401d54ccb43852e4dc.png

看看这个贪婪例子,得到这个结果由于以下原因:

1.由于存在‘.*’则这一部分在贪婪模式下会在满足正则表达式的情况下让匹配的段最长

2. d+表示任意长度的数字组合(至少有一个数字)

所以为了满足1的贪婪条件,2的数字组合长度为1

而第二种情况下,在‘.’后加上‘?’使得前面这一段变的非贪婪(即匹配到满足条件的即可),所以当它们匹配到第一个数字1时,就结束‘.*’ 这一部分的匹配,开始‘d+’这一部分。

1.4 {}

“{}”实质上也是一个限定词的用法,其限定前面字符所出现的次数,其常用的模式有三种,分别是“{数字}”、“{数字,}”和“{数字1, 数字2}”。举个例子,如“{1}”、“{1,}”和“{1, 3}”。

1.形式A 限定{}前字符数量

如下图所示,.{2}指定了两个之间有2个字符,所以不会匹配只有一个中间字符的‘pcp’,而且根据贪婪匹配原则,会选取前面‘.*’最长的匹配结果所以选择的是‘pbap’而不是‘pabp’,‘pcpp’

1ce1d61ad05f5d6545144d8b579aa69b.png

2.形式B “{1,}”代表的是前面的字符出现1次及以上;特殊字符“{2,}”代表的是前面的字符出现2次及以上;特殊字符“{3,}”代表的是前面的字符出现3次及以上;以此类推。举个栗子,如下图所示。

19548e0322ac3e2dc7eaa7abda35aca3.png

3.形式C “{2, 3}” 代表的是前面的字符至少出现2次,最多出现3次;

bb16a6683a1855dceb7d31c47d89fe71.png

注意,这里采用了‘非贪婪’模式,所以出现第一个符合匹配正则表达式的部分之后,该p前面的部分将最短。

1.5 "|"

竖线“|”实质上是一个或的关系。并且当两个都满足时会优先匹配最前面的

bb12efb04389e340986876632e4bebf6.png

还能够使用这种多层的匹配

9c76643f84d513e0811d137f780be513.png

为什么这里不是paa而是paap呢?因为match函数的规则。

5026478a90d2dea08ea67755d483b1b7.png

也就是说re.match会从最左边开始匹配,并且要求必须在起始位置开始匹配。

那么这里的匹配可以理解为:paap14是在起始位置的,而paa14和起始位置paap14不符合(这里的起始不是指第一个,而是能从第一个字符向后匹配到某个字符,期间不断不少,个人理解)

1.6 "[]"

正则表达式特殊符号是“[]”。中括号十分实用,其有特殊含义,其代表的意思是中括号中的字符只要满足其中任意一个就可以。

A. 匹配模式为[abcd],在这里正则表达式代表的意思是字符串第一个字符是abcd四个字符中的任意一个。

ceaf680082d222c7d8b8ee00bf2863e4.png

B. [0-9]代表是的是0到9中任意一数字

000bc18edd291623c6e0d2591efde973.png

C. [a-z]代表26个英文小写字母;[A-Z]代表26个英文大写字母。

f6c9f83b0e0a317d7c485a11ce3907b5.png

D. [^],在中括号中加入特殊字符“^”,表示非,取反的意思。举个栗子,“[^1]”的意思是字符不等于1。

fa4a144c9f29238a18314af87f23fdc6.png

还有一些用法,以下就不一一实例了

4e8f4c23571f3c6aa2f865eb6fcd2bee.png

2.特殊字符类

2.1 “s”与“S”

“s”代表的意思是匹配空格

a77bdccfb6ba05e3bbe860141d6a54a8.png

s* 匹配多个空格

d7758f5800aa2da09d9b1a70310b23da.png

“S”代表的意思与“s”代表的意思刚刚相反,也就是说匹配的那个字符只要不是空格,都可以匹配。

b8f80742313b869be7e17e67ed0a8575.png

2.2 [u4E00-u9FA5]

[u4E00-u9FA5]特殊字符是固定的写法,其代表的意思是汉字。换句话说,只要字符中是汉字,就可以通过该字符进行匹配,该特殊字符也是用中括号括起来的。

db46718c84c12e74cb05bcb92e9ebd61.png

2.3 "w"与"W"

“w”代表的意思是该字符为任意字符,但是和特殊字符“.”的意思不同。

“w”代表的字符主要包括26个大写字母A到Z,即[A-Z]、26个小写字母a到z,即[a-z]、10个阿拉伯数字0到9,即[0-9]和下划线“_”。总结起来就是,“w”代表的意思是[A-Za-z0-9_]中任意一个字符。

6201fe5a3b3d39d7c45aebfb7b107189.png

“W”代表的意思与“w”刚刚相反,也就是匹配除了[A-Za-z0-9_]之外的其他字符。接上一步的例子,此时将“w”改为“W”。

c22fd1863243d080d9b97215a30364dd.png

对比:“.” 代表的意思是任意字符,其范围比“w”代表的意思要广。

3. 简单应用

用以上所学的正则表达式字符和模式实现一个简单的应用。

import re
string = 'Harold写博客的时间是2019年1月14日'
string2 = 'Harold写博客的时间是2019/1/14'
string3 = 'Harold写博客的时间是2019-01-14'
string4 = 'Harold写博客的时间是2019年1月'
string5 = 'Harold写博客的时间是2019/1'

reg_str = '.*写博客的时间是(d+[年/-]d{1,2}($|[月/-])(d{1,2}($|日)|$))'

for i in {string,string2,string3,string4,string5}:
    match_str = re.match(reg_str,i)
    print(match_str.group(1))

# 2019年1月14日
# 2019年1月
# 2019/1/14
# 2019/1
# 2019-01-14

以下就是今天所“查漏补缺”的正则表达式,目前还只是最基础的应用,下次会详细写python正则表达式的处理函数。

相关文章:

  • jq获取页面高度_jquery常见获取高度
  • 用XML作sql和web应用的桥
  • 梅林安装opkg后安装iperf3_压滤机安装时需要注意的事项和安装后调试
  • 使用VSS-本地练习最基本的用法
  • 操作excel方便么_如何免费将Excel转PDF?
  • QQ斗地主记牌器主程序脱壳并解除使用次数限制
  • 《rust腐蚀》建服视频教学_二年级上册语文识字4田家四季歌朗读+视频+知识点+图文解读+练习...
  • 今天玩得很开心
  • jedispool redis哨兵_应用 | Redis实现 主从,单例,集群,哨兵,配置应用
  • CsvJdbc - Java 访问csv 文件的的JDBC驱动
  • restapi如何传图片_没有网络,电脑如何传文件给手机?
  • 男人必看得5个故事
  • python词云图代码示例 无jieba_python中实现词云图的示例
  • 免费的在线电影
  • 权重矩阵最小路径_最短路径和矩阵乘法
  • Consul Config 使用Git做版本控制的实现
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • Gradle 5.0 正式版发布
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • python大佬养成计划----difflib模块
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • webpack入门学习手记(二)
  • 前端代码风格自动化系列(二)之Commitlint
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • Spring Batch JSON 支持
  • 翻译 | The Principles of OOD 面向对象设计原则
  • 正则表达式-基础知识Review
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • # Maven错误Error executing Maven
  • #FPGA(基础知识)
  • (1)(1.9) MSP (version 4.2)
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .net操作Excel出错解决
  • .NET中GET与SET的用法
  • ::
  • @Bean注解详解
  • [《百万宝贝》观后]To be or not to be?
  • [Android Studio 权威教程]断点调试和高级调试
  • [Android 数据通信] android cmwap接入点
  • [AutoSar]状态管理(五)Dcm与BswM、EcuM的复位实现
  • [BeginCTF]真龙之力
  • [C/C++]数据结构 栈和队列()
  • [ComfyUI进阶教程] animatediff视频提示词书写要点
  • [datastore@cyberfear.com].Elbie、[thekeyishere@cock.li].Elbie勒索病毒数据怎么处理|数据解密恢复
  • [JavaWeb]——过滤器filter与拦截器Interceptor的使用、执行过程、区别
  • [JavaWeb]—前端篇
  • [leetcode] 61. 旋转链表
  • [lintcode easy]Maximum Subarray
  • [Oh My C++ Diary]operator++()和operator++(int)的区别
  • [one_demo_12]递归打印*\n*.*.\n*..*..\n图形
  • [OpenCV学习笔记]获取鼠标处图像的坐标和像素值