Python:如何使用正则表达式快速处理字符串

news2024/12/22 15:01:35

文章目录

  • 前言
  • 一、正则表达式
      • 1、元字符详解
      • 2、等价方法(速记)
  • 二、常用的表达式
      • 1、常用的正则表达式
      • 2、先行断言和后行断言
  • 三、Python匹配函数
      • 1、Match函数
      • 2、Search函数
      • 3、Findall函数
  • 四、regex101网站推荐


前言

1、正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

2、Python中我们经常用match、search、findall函数搭配使用快速获取关键字符串。


一、正则表达式

1、元字符详解

pattern:匹配的关键字

元字符描述
\将下一个字符标记符、或一个向后引用、或一个八进制转义符。
^匹配输入字行首。
$匹配输入行尾。
*匹配0个或多个表达式。例:表达式 zo*能匹配“z”,也能匹配“zo”以及“zoooo…”。因为o可以是0个,也可以是多个。
+匹配1个或多个表达式。例:表达式zo+能匹配“zo”以及“zoooo…”,但不能匹配“z”。因为o最少有1个。
?匹配0个或1个表达式。例:表达式zo?能匹配“z”以及“zo”,因为o可以存在0个或1个。
{n}匹配字符n次。例:表达式o{2}能匹配“food”中的两个o。
{n,}匹配字符至少n次。表达式o{2,}能匹配“foooood”中的所有o,不能匹配“fod”中的“o”,因为fod中只有1个o,而o{2,}要求2个o以上。
{n,m}匹配字符最少n次且最多匹配m次。例如表达式o{1,3}能匹配“fod”,“food”以及“foood”,o存在1次或3次。
?当该字符紧跟在任何一个其他限制符(*,+,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少地匹配所搜索的字符串,而默认的贪婪模式则尽可能多地匹配所搜索的字符串。例如,对于字符串“oooo”,“o+”将尽可能多地匹配“o”,得到结果[“oooo”],而“o+?”将尽可能少地匹配“o”,得到结果 [‘o’, ‘o’, ‘o’, ‘o’]
.匹配除“\n”和"\r"之外的任何单个字符。要匹配包括“\n”和"\r"在内的任何字符,请使用像“[\s\S]”的模式。
(pattern)匹配pattern并获取这一匹配。
(?:pattern)非获取匹配,匹配pattern但不获取匹配结果,不进行存储供以后使用。
(?=pattern)正向先行断言,匹配后面有pattren的内容,例:表达式\S(?=你),能匹配“我爱你”中的“爱”,因为“爱”的后面有“你”所以被成功匹配。(\S表示匹配任何可见字符)
(?!pattern)负向先行断言,匹配后面没有pattren的内容,例:表达式\S(?!你),无法匹配“我爱你”中的“爱”,我需要匹配的是字符后面没有“你”的内容。(\S表示匹配任何可见字符)
(?<=pattern)正向后行断言,,匹配前面有pattren的内容,例:表达式(?<=我)\S,能匹配“我爱你”中的“爱”,因为“爱”的前面有“我”所以被成功匹配。(\S表示匹配任何可见字符)
(?<!pattern)负向后行断言,匹配前面没有pattren的内容,例:表达式\S(?!我),无法匹配“我爱你”中的“爱”,我需要匹配的是字符后面没有“我”的内容。(\S表示匹配任何可见字符)
x|y匹配x或y。例如,表达式“z|food”能匹配“z”或“food”(此处请谨慎)。“[z|f]ood”则匹配“zood”或“food”。
[xyz]字符集合。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”。
[^xyz]负值字符集合。匹配未包含的任意字符。例如,“[^abc]”可以匹配“plain”中的“plin”任一字符。
[a-z]字符范围。匹配指定范围内的任意字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意小写字母字符。
[^a-z]负值字符范围。匹配任何不在指定范围内的任意字符。例如,“[^a-z]”可以匹配任何不在“a”到“z”范围内的任意字符。
\b匹配一个单词的边界,也就是指单词和空格间的位置(即正则表达式的“匹配”有两种概念,一种是匹配字符,一种是匹配位置,这里的\b就是匹配位置的)。例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”;“\b1_”可以匹配“1_23”中的“1_”,但不能匹配“21_3”中的“1_”。
\B匹配非单词边界。“er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。
\d匹配一个数字字符。等价于[0-9]。
\D匹配一个非数字字符。等价于[^0-9]。
\f匹配一个换页符。
\n匹配一个换行符。
\r匹配一个回车符。
\s匹配任何不可见字符,包括空格、制表符、换页符等。
\S匹配任何可见字符。
\t匹配一个制表符。
\v匹配一个垂直制表符。
\w匹配包括下划线的任何单词字符。类似但不等价于“[A-Za-z0-9]”,这里的"单词"字符使用Unicode字符集。
\W匹配任何非单词字符。等价于“[^A-Za-z0-9_]”。
\num匹配num,其中num是一个正整数。对所获取的匹配的引用。例如,“(.)\1”匹配两个连续的相同字符。
\n标识一个八进制转义值或一个向后引用。如果\n之前至少n个获取的子表达式,则n为向后引用。否则,如果n为八进制数字(0-7),则n为一个八进制转义值。
< >匹配词(word)的开始(<)和结束(>)。例如正则表达式<the>能够匹配字符串"for the wise"中的"the",但是不能匹配字符串"otherwise"中的"the"。注意:这个元字符不是所有的软件都支持的。
( )将( 和 ) 之间的表达式定义为“组”(group),并且将匹配这个表达式的字符保存到一个临时区域(一个正则表达式中最多可以保存9个),它们可以用 \1 到\9 的符号来引用。
|将两个匹配条件进行逻辑“或”(or)运算。

2、等价方法(速记)

一、等价:
等价是等同于的意思,表示同样的功能,用不同符号来书写。
?,*,+,\d,\w 都是等价字符
?等价于匹配长度{0,1}
*等价于匹配长度{0,}
+等价于匹配长度{1,}
\d等价于[0-9]
\D等价于[^0-9]
\w等价于[A-Za-z_0-9]
\W等价于[^A-Za-z_0-9]。

二、常用运算符与表达式:
^ 开始
()域段
[] 包含,默认是一个字符长度
[^] 不包含,默认是一个字符长度
{n,m} 匹配长度
. 任何单个字符(\. 字符点)
| 或
\ 转义
$ 结尾
[A-Z] 26个大写字母
[a-z] 26个小写字母
[0-9] 09数字
[A-Za-z0-9] 26个大写字母、26个小写字母和09数字

二、常用的表达式

1、常用的正则表达式

常见的正则表达式

1.验证用户名和密码:("[a-zA-Z]\w{5,15}")正确格式:"[A-Z][a-z]_[0-9]"组成,并且第一个字必须为字母6~16位;
2.验证电话号码:("(\d{3,4}-)\d{7,8}")正确格式:xxx/xxxx-xxxxxxx/xxxxxxxx;
3.验证手机号码(包含虚拟号码和新号码段):"1([38][0-9]|4[5-9]|5[0-3,5-9]|66|7[0-8]|9[89])[0-9]{8}"4.验证身份证号(15位):"\d{14}[[0-9],0-9xX]",(18位):"\d{17}(\d|X|x)"5.验证Email地址:("\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*")6.只能输入由数字和26个英文字母组成的字符串:("[A-Za-z0-9]+")7.整数或者小数:[0-9]+([.][0-9]+){0,1}
8.只能输入数字:"[0-9]*"9.只能输入n位的数字:"\d{n}"10.只能输入至少n位的数字:"\d{n,}"11.只能输入m~n位的数字:"\d{m,n}"12.只能输入零和非零开头的数字:"(0|[1-9][0-9]*)"13.只能输入有两位小数的正实数:"[0-9]+(\.[0-9]{2})?"14.只能输入有1~3位小数的正实数:"[0-9]+(\.[0-9]{1,3})?"15.只能输入非零的正整数:"\+?[1-9][0-9]*"16.只能输入非零的负整数:"\-[1-9][0-9]*"17.只能输入长度为3的字符:".{3}"18.只能输入由26个英文字母组成的字符串:"[A-Za-z]+"19.只能输入由26个大写英文字母组成的字符串:"[A-Z]+"20.只能输入由26个小写英文字母组成的字符串:"[a-z]+"21.验证是否含有^%&',;=?$\"等字符:"[%&',;=?$\\^]+"。
22.只能输入汉字:"[\u4e00-\u9fa5]{0,}"23.验证URL:"http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?"24.验证一年的12个月:"(0?[1-9]|1[0-2])"正确格式为:"01""09""10""12"25.验证一个月的31天:"((0?[1-9])|((1|2)[0-9])|30|31)"正确格式为;"01""09""10""29"和“30~31”。
26.获取日期正则表达式:\\d{4}[|\-|\.]\d{\1-\12}[|\-|\.]\d{\1-\31}?
评注:可用来匹配大多数年月日信息。
27.匹配双字节字符(包括汉字在内)[^\x00-\xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计128.匹配空白行的正则表达式:\n\s*\r
评注:可以用来删除空白行
29.匹配HTML标记的正则表达式:<(\S*?)[^>]*>.*?</>|<.*? />
30.匹配首尾空白字符的正则表达式:\s*|\s*
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式
31.匹配网址URL的正则表达式:[a-zA-z]+://[^\s]*
32.匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线)[a-zA-Z][a-zA-Z0-9_]{4,15}
评注:表单验证时很实用
33.匹配腾讯QQ号:[1-9][0-9]{4,}
34.匹配中国邮政编码:[1-9]\\d{5}(?!\d)
评注:中国邮政编码为6位数字
35.匹配ip地址:([1-9]{1,3}\.){3}[1-9]。
评注:提取ip地址时有用
36.匹配MAC地址:([A-Fa-f0-9]{2}\:){5}[A-Fa-f0-9]
37.匹配括号内的内容(懒惰匹配):\((.*?)\)
38.匹配括号内的内容(贪婪匹配):\((.*)\)

2、先行断言和后行断言

在使用正则表达式的过程中发现先行断言和后行断言比较好用,但是也比较难理解,这里刚好做一下解释。

1)正向先行断言:(?=pattren)
正向先行断言,匹配后面有pattren的内容。

如何匹配python yyds,what is the python第一个python?这时可以用到正向先行断言。

在这里插入图片描述

根据上图,因为第一个python 的后面紧接着yyds,因此直接使用.*(?=yyds),就能直接匹配到第一个python


2)负向先行断言:(?!pattren)
负向先行断言,匹配后面没有pattren的内容。

如何匹配python yyds,what is the pycharm含有py的pycharm,这时可以用到负向先行断言。

在这里插入图片描述根据上图,py后面没有thon的只有pycharm


3)正向后行断言:(?<=pattren)
正向后行断言,匹配前面有pattren的内容。
如何匹配python yyds,what is the pycharm前面有python的内容,这时可以用到正向后行断言。

在这里插入图片描述
根据上图,前面有python的字符串为 yyds,what is the pycharm


4)负向后行断言:(?<!pattren)

负向后行断言,匹配字符串前面没有pattren的内容。
如何匹配python yyds,what is the pycharm yyds前面没有python 的yyds,这时可以用到负向后行断言。

在这里插入图片描述

根据上图,前面没有python的yyds为pycharm之后的yyds


.*是匹配所有(除换行符外)的所有字符串。

三、Python匹配函数

注:使用这三个函数需要使用re库

1、Match函数

1)re.match函数介绍
re.match从字符串的起始位置开始匹配,如果没有在起始位置匹配成功的话则会返回None。

import re

#如果成功匹配字符串会返回一个对象,如果没有则会返回None;
matchobj = re.match(pattern,string,flags=0)

参数
1)pattern:匹配的正则表达式
2)string:需要匹配的字符串
3)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 为了增加可读性,忽略空格和#后面的注释


#返回结果的调用方法
matchobj.groups()
matchobj.group(num=0)
matchobj.span()

2)re.match函数方法案例

import re

#re.match方法
#注意1:group用法
string="python yyds"
matchobj = re.match("python",string)
print(matchobj.group(0))
>>>python

#注意2:需要从字符串开始的地方匹配
string="python yyds"
matchobj = re.match("yyds",string)
print(matchobj.group(0))
>>>AttributeError: 'NoneType' object has no attribute 'group'
#re.match是从字符串的起始位置开始匹配,如果字符串开始未匹配到字符串,则会报错。

#注意3:需要优化一下
string="python yyds"
matchobj = re.match("Python",string,re.I)
#如果没有匹配到结果就使用matchobj.group(0)属性报错。
if matchobj:
	print(matchobj.group(0))

#注意4:flags大小写设置
string="python yyds"
matchobj = re.match("Python",string,re.I)
if matchobj:
	print(matchobj.group(0))
>>>python
#这里匹配到了python,因为re.I忽略大小写匹配。

2、Search函数

1)Search函数介绍
re.search扫描整个字符串并返回第一个成功的匹配;re.search和re.match的区别在于re.match只匹配字符串的开始,如果开始匹配不上,则匹配失败;而re.search从任何地方找。

import re

#同样的正则表达式,看看re.match和re.search的区别

#re.match
string="python yyds"
matchobj = re.match("yyds",string)
if matchobj:
	print(matchobj.group(0))
>>>AttributeError: 'NoneType' object has no attribute 'group'
#re.match是从字符串的起始位置开始匹配,如果字符串开始未匹配到字符串,则会报错。

#re.search
string="python yyds"
matchobj = re.search("yyds",string)
if matchobj:
	print(matchobj.group(0))
>>>yyds

3、Findall函数

1)Findall函数介绍
re.findall会返回所有匹配到的结果,匹配的结果为列表(,re.findall与search、match的区别在于:search和match是一次匹配,找到后返回匹配对象;而findall则会多次匹配,返回匹配列表。

import re

string = "python is the best language,python yyds"
matchobj = re.findall("python",string)
if matchobj is not None:
	print(matchobj)
	print(matchobj[0])
>>>['python', 'python']
>>>python

四、regex101网站推荐

在这个网站可以输入正则表达式来匹配函数,能够快速匹配到结果,非常好用。

点击进入regex101网站

在这里插入图片描述


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

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

相关文章

Android Studio使用Mob实现短信验证功能遇到的问题解决

一、Mob短信验证 全球领先的数据智能科技平台-MobTech袤博解决 进行注册登入 登入成功后&#xff0c;点击开发者服务中的短信验证&#xff0c;进入开发者平台 填好信息创建成功后显示下图&#xff0c;可以看到对应信息如下&#xff08;注意记住AppKey和AppSecretKey&#xff…

怎样让Odoo 16自动根据销售订单创建采购订单或生产订单

我们在销售产品时通常只处理销售过程&#xff0c;但是&#xff0c;在根据消费者的要求交付给消费者之前&#xff0c;产品会必须有库存。这时候&#xff0c;货物要么从车间「生产」&#xff0c;要么从供应商「采购」。当销售订单确认但商品缺货时&#xff0c;我们偶尔不得不先获…

vite.config.ts--服务器、简化导入写法、element-plues按需导入的配置

vite.config.ts--服务器、简化导入写法、element-plues按需导入的配置说明一、服务器server二、简化导入写法三、element-plus按需导入完说明 本教程适用于vite创建的前端项目服务器server简化导入写法element-plus按需导入 一、服务器server import { defineConfig } from …

MFC界面控件BCGControlBar v33.3 - 编辑控件功能升级

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中&#xff0c;并为您节省数百个开发和调试时间。 BCGControlBar专业版和BCGSuite for MFC v33.3已正式发布了&#xff0c;该版本包含了增强的Ribbon自定义、新的…

[附源码]计算机毕业设计Python点餐系统(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

智能座舱进入多元化交互时代,本土芯片厂商如何领跑?

“智能座舱市场正在进入一个全新的发展阶段。”芯驰科技资深产品市场总监金辉在2022高工智能汽车年会上表示&#xff0c;智能座舱已经进入了多屏互动、多模交互、多人交互等多元化交互时代。 芯驰科技资深产品市场总监金辉 作为未来的“第三生活空间”以及主机厂差异化竞争的焦…

【问答篇】Java 线程篇 面试题(一)

每天进步一点~ (ps: 文章内容及图片出处来自本人公众号~) 01、问&#xff1a;请谈谈你对并发编程优缺点的认识与理解 ~ 答&#xff1a; 优点&#xff1a;充分利用多核CPU的计算能力&#xff0c;通过并发编程的形式将多核CPU的计算能力发挥到极致&#xff0c;性能得到提升。 …

【Java编程】MVC框架和经典三层结构

MVC框架和经典三层结构1.MVC框架 JSP&#xff0c;全称 Java Server Pages&#xff0c;中文名是 Java 服务器页面&#xff0c;其实是一种以 Java 为主的跨平台 Web 开发语言。JSP 文件由传统网页 HTML 文件插入 Java 程序段所形成&#xff0c;实现了 HTML 语法的 Java 扩张。在…

一篇文章了解 Apache Druid

前言 本文隶属于专栏《大数据技术体系》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和参考文献请见大数据技术体系 概述 Apache Druid 是一个实时分析型数据库&#xf…

图文结合带你搞懂MySQL日志之Error Log(错误日志)

GreatSQL社区原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本&#xff0c;使用上与MySQL一致。作者&#xff1a;KAiTO文章来源&#xff1a;社区原创 往期回顾&#xff1a; 图文结合带你搞懂MySQL日志之Redo Log(重做日志)…

[附源码]计算机毕业设计Python的云网盘设计(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

极智AI | 谈谈昇腾CANN量化

欢迎关注我的公众号 [极智视界]&#xff0c;获取我的更多笔记分享 大家好&#xff0c;我是极智视界&#xff0c;本文介绍一下 谈谈昇腾CANN量化。 昇腾CANN的量化体现在AMCT工具&#xff0c;也即模型压缩工具&#xff0c;后面再来说AMCT&#xff0c;这篇先聊一下昇腾CANN的量…

SpringBoot学习小结之滑块验证码生成库tianai-captcha

文章目录前言一、后端springboot1.1 yml 配置1.2 跨域配置1.3 资源配置1.4 Controller二、前端jquery2.1 通用代码2.2 滑动验证码2.3 旋转验证码2.4 滑动还原验证码2.5 文字点选验证码三、源码探秘和总结3.1 前端代码3.2 后端代码3.3 总结参考前言 最近发现一个有趣的 Java 验…

Java根据ip地址获取归属地

最近&#xff0c;各大平台都新增了评论区显示发言者ip归属地的功能&#xff0c;例如哔哩哔哩&#xff0c;微博&#xff0c;知乎等等。 下面&#xff0c;我就来讲讲&#xff0c;Java 中是如何获取 IP 属地的&#xff0c;主要分为以下几步 通过 HttpServletRequest 对象&#xf…

JVM监控及诊断工具-GUI

1. 工具概述 使用上一章命令行工具或组合能帮您获取目标Java应用性能相关的基础信息&#xff0c;但它们存在下列局限: 1)无法获取方法级别的分析数据&#xff0c;如方法间的调用关系、各方法的调用次数和调用时间 等&#xff08;这对定位应用性能瓶颈至关重要&#xff09;。 2…

【MybatisPlus】最全面的MybatisPlus通关教程

前言 本文为最全面的MybatisPlus通关教程相关介绍&#xff0c;下边将对MyBatisPlus概述&#xff0c;MyBatisPlus快速入门&#xff0c;CRUD扩展&#xff08;包括&#xff1a;插入操作、主键生成策略、更新操作&#xff0c;自动填充&#xff0c;乐观锁&#xff0c;查询操作&#…

我学python的那段日子(四)选择结构和循环结构

1.选择结构 总所周知&#xff0c;Java里面也有选择结构&#xff0c;分别是if单分支选择结构、if-else结构多重if结构和switch结构&#xff0c;同样的&#xff0c;Python里也有选择结构&#xff0c;分别是是if单分支选择结构、if-else结构多重if结构。 1.1 if选择结果 ​ if选…

Servlet生命周期和线程安全

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;JAVA开发者…

CANoe-是如何对ECU和网络进行测试的

CANoe工具是汽车仿真测试开发中使用最广泛的工具 Test Module/Test Unit 除了仿真模块和分析模块,CANoe还引入了另一个组件进行测试:Test Module(测试模块)和Test Unit(测试单元) test module调用的是capl脚本、.net脚本或xml文件,而test unit用的是vTESTstudio插件 实…

12.18

一.加强练习promise 1.fs模块 const fs require(fs) const p new Promise((resolve,reject) > {fs.readFile(./resource/context.txt, (err,data) > {if (err) reject(err)resolve(data)}) }) p.then((value) > {console.log(value.toString()) }, (reason) > …