Python函数篇(7)-正则表达式
1.正则表达式
正则表达式为高级的文本模式匹配,抽取,与/或文本形式的搜索和替换功能提供了基础,简单的来说,正则表达式是由一些字符和特殊符号组成的字符串。Python通过标准库中的re模块来支持正则表达式。
2.特殊符号和字符
首先介绍一下最常见的特殊符号和字符,即所谓的元字符。
| 表示法 | 描述 | 正则表达式用法示例 |
|---|---|---|
| literal | 匹配文本字符串的字面值literal | re.findall("chen","sadchen21") |
| . | 匹配任意字符(除了\n之外) | re.findall("c..n","sadchen21") |
| ^ | 从字符串开始部分开始匹配 | re.findall("^sad","sadchen21") |
| $ | 匹配字符串的终止部分 | re.findall("21$","sadddchen21") |
| * | 匹配0次或多次前面出现的正则表达式 | re.findall("sad*","saddddchen21") |
| + | 匹配1次或多次前面出现的正则表达式 | re.findall("sad+","sadddchen21") |
| ? | 匹配0次或者1次前面出现的正则表达式 | re.findall("sad?","sadddchen21") |
| {N} | 匹配N次前面出现的正则表达式 | re.findall("sad{3}","sadddchen21") |
| {M,N} | 匹配M~N次前面出现的正则表达式 | re.findall("sad{1,3}","sadddcen21") |
| [] | 匹配来自字符集的任一单一字符 | re.findall("[a-z]","sadddcen21") |
| [^..] | 不匹配此字符集中出现的任一字符,包括某一范围的字符 | re.findall("[^a-z]","sadddcen21") |
| (...) | 匹配封闭的正则表达式,然后另存为子组 | re.findall("[(a-z)]","sadddcen21") |
| \d | 匹配任何的十进制数,与[0-9]一致(/D与/d相反,不匹配任何非数值型的数字) | re.findall("\d","sa2dcen21") |
| \w | 匹配任何字母数字字符,与[A-Z],[a-z],[0-9]相同,(\W与之相反) | re.findall("\w","sa2dcen21") |
| \s | 匹配任何空格字符,与\n\r\t等相同,(与\S相反) | re.findall("\s","sa2dce\nn 21") |
| \b | 匹配任何单词边界,匹配特殊字符(\B与之相反) | re.findall(r"I\b","I am Czp") |
在上面/b的例子中,为什么要加r?
r的作用就是让后面的字符串不做任何的转义,如果不加r能不能起到相同的作用呢?
re.findall("I\\b","I am Czp") 通过转义符\来实现
3.重要符号详细用法讲解
- 表示择一的管道符号“|”,表示一个“从多个模式中选择其一”的操作,它用于分割不同的正则表达式,择一匹配有时候也被称为(union)或逻辑或
re.findall("ka|b","sdkakb11") 匹配ka或b
re.findall("ka|b","sdka11")
- 匹配任意字符“.”,点好或句点(.)符号匹配除了换行符\n以外的任意字符
re.findall("s..a","sdka11") 匹配在s和a之间任意的两个字符
re.findall("..","sdka11") 匹配任意两个字符
re.findall(".a","sdka112") 匹配a前的任意一个字符
要显式匹配一个句点符号本身,必须使用反斜杠转义句点符号的功能,例如“\.”
- 从字符串起始或者结尾或者单词边界匹配“^”“$”“\b”
re.findall("^sa","sdka112") 匹配以s开头的字符或字符串
re.findall("12$","sdka112") 匹配以12结尾的字符或字符串
匹配边界字符“\b”
\b用于匹配一个单词的边界,这意味着如果一个模式必须位于单词的起始部分,就不管该单词前面(单词位于字符串中间)是否有任何字符(单词位于首行),而\B将匹配出现在一个单词中间的模式,即不是单词边界
re.findall("er","never") 匹配任意包含the的字符串
re.findall(r"er\b","never") 匹配任意以er为起始位置的字符串
re.findall(r"er\B","evern") 匹配包含er但不以er为起始的字符串
创建字符集“[]”
“.”可以用于匹配任意符号,但某些时候需要匹配某些特定字符,这就需要[],用来匹配一对方括号中包含的任何字符。如b[ner]t匹配的字符串就是bnt,bet,brt,方括号表示逻辑或的功能,对于单个字符,如果想要:要么匹配a,要么匹配b,就可以用[ab]表示,字符集只适用于单字符的情况,如果要匹配多个字符,就需要使用择一方法“|”
最常用的特殊符号“”“+”“?”
""、"?"、"+"都可以用来匹配一个、多个或者没有出现的字符串模式,"*”用来匹配其左边的正则表达式出现零次或多次,“+”号将匹配一次或多次出现的情况,“?”将匹配零次或一次出现的正则表达式,而{N}或{M,N}这将最终精确的匹配前面的正则表达式N次或一定范围的次数。
当模式匹配使用分组操作符的时候,正则表达式的引擎将试图匹配出尽可能多的字符,这叫做贪婪匹配
re.findall("sad*","saddddsds") 匹配d,d可以出现0次,或多次
re.findall("sad+","saddddsds") 匹配d,d不可以出现0次,匹配1次或多次
re.findall("sad?","saddddsds") 匹配d,d可以出现0次,匹配0次或1次
re.findall("\d{2}","sad123dsds") 匹配两个连续的数字字符
如果想要提取任意已经成功匹配的特定字符串或子字符串,就需要用“()”来包裹正则表达式
当使用正则表达式的时候,一对圆括号可以实现以下任意一个功能
- 对正则表达式进行分组
- 匹配子组
示例:当有两个不同的正则表达式而且想用它们来比较同一个字符串的时候,就需要用到“()”,还有对正则表达式进行分组可以重复使用操作符,使匹配到的子字符串保存起来以供后续使用。
扩展表示法,以问号开始(?..),很重要的一个(?P
4.re模块的核心函数和方法
常见的正则表达式属性
compile():使用可选的标记来编译正则表达式的模式,返回一个对象
matach():匹配字符串,如果成功,就返回匹配对象,如果失败,就返回None
search():匹配第一次出现的正则表达式,成功,返回匹配对象,失败,就返回None
findall():查找字符串中所有出现的正则表达式模式,并返回一个匹配列表
finditer(): 与findall相同,但返回的不是一个列表,而是一个迭代器
spilt():将字符串分割为列表,返回成功匹配的列表
sub():替换所有正则表达式的模式在字符串中出现的位置
purge():清楚隐式编译的正则表达式模式
group():返回整个匹配对象,或者编号为num的特定子组
函数篇就写到这里,接下来会写面向对象部分的内容,如果有遗漏的,欢迎大家和我交流,我会第一时间补上遗漏的知识点。
Python函数篇(7)-正则表达式的更多相关文章
- Python函数篇(5)-装饰器及实例讲解
1.装饰器的概念 装饰器本质上就是一个函数,主要是为其他的函数添加附加的功能,装饰器的原则有以下两个: 装饰器不能修改被修饰函数的源代码 装饰器不能修改被修改函数的调用方式 装饰器可以简单的理 ...
- python函数篇:名称空间、作用域和函数的嵌套
一.名称空间:(有3类) (1)内置名称空间(全局作用域) (2)全局名称空间(全局作用域) (3)局部名称空间(局部作用域) 关于名称空间的查询: x=1 def func(): print('fr ...
- Python函数篇:dict函数和列表生成式
1.dict函数语法:dict()dict(**kwarg) dict(mapping, **kwarg) dict(iterable, **kwarg) 第一种:dict()构造一个空字典 h=di ...
- Python函数篇:装饰器
装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理. ...
- Python函数篇
1.函数名的命名规则: 函数名必须以下划线或字母开头,可以包含任意字母.数字或下划线的组合.不能使用任何的标点符号: 函数名是区分大小写的. 函数名不能是保留字. 2. 形参和实参 形参:形式参数,不 ...
- Python函数篇(二)之递归函数、匿名函数及高阶函数
1.全局变量和局部变量 一般定义在程序的最开始的变量称为函数变量,在子程序中定义的变量称为局部变量,可以简单的理解为,无缩进的为全局变量,有缩进的是局部变量,全局变量的作用域是整个程序,而局部变量的作 ...
- Python函数篇(2)-递归函数、匿名函数及高阶函数
1.全局变量和局部变量 一般定义在程序的最开始的变量称为函数变量,在子程序中定义的变量称为局部变量,可以简单的理解为,无缩进的为全局变量,有缩进的是局部变量,全局变量的作用域是整个程序,而局部变量的作 ...
- Python函数篇(3)-内置函数、文件处理
1.内置函数 上一篇文章中,我重点写了reduce.map.filter3个内置函数,在本篇章节中,会补充其他的一些常规内置函数,并重点写max,min函数,其他没有说明的函数,会在后面写到类和面向对 ...
- Python函数篇(4)之迭代器与生成器
1.文件操作的"b模式"(补充) 在上一篇文章中,我在最后一部分写了文件处理的一些方法,但是觉得还是有必要再提一下如下的内容: 像rb.wb.ab这种模式,是以字节的形式操作,需要 ...
随机推荐
- 手动编译 Nginx 并安装 VeryNginx
VeryNginx 是个非常有意思且便捷的 Nginx 扩展程序.最近新开了台 VPS,便想体验一下它带来的快感. VeryNginx 有个不超过 5 行的安装方法,但作为强迫症我更喜欢使用自己编译的 ...
- 前端测试框架Jest系列教程 -- Asynchronous(测试异步代码)
写在前面: 在JavaScript代码中,异步运行是很常见的.当你有异步运行的代码时,Jest需要知道它测试的代码何时完成,然后才能继续进行另一个测试.Jest提供了几种方法来处理这个问题. 测试异步 ...
- mysql 索引类型
根据类型分为普通索引2种类型,hash 和b-tree 最常用 hash是按一对一索引的.速度 最快但不支持范围 比如where name = 'dd' 最快.但是使用 date >3 ...
- 通过YUM升级centOS内核,以便安装docker
安装Docker要满足一定的条件,对于cents系统,要求必须是64位,并且内核版本是3.10以上. 如果你的centos操作系统内核低于3.10,需要升级到这个版本以上,才能安装docker. 第一 ...
- js 数组去重复的方法
数组去重复是js中常用的方法,归纳了四种如下: 1. for + indexOf 去重复 var arr = [3,5,5,4,1,1,2,3,7,2,5]; var target = []; fo ...
- Dynamics CRM可以设置会话超时和非活动超时吗?
本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复266或者20171213可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong.me ...
- PHP如何强制下载文件
很多网站都需要做文件下载的功能.如果直接给连接的方式下载的话有很多的弊处...因为有时候需要对下载权限的检查,对下载次数的检查.所以一般采用php的方法进行安全下载.但是下载的时候如果是txt jpg ...
- post 与get 区别
刷新/后退按钮 GET后退按钮/刷新无害,POST数据会被重新提交(浏览器应该告知用户数据会被重新提交). 书签 GET书签可收藏,POST为书签不可收藏. 缓存 GET能被缓存 缓存是针对URL来进 ...
- 调用WebService获取数据
以下调用方法,以调用苏州天气接口为例. 一.后台请求服务 方法一.C#后台,通过构建Soap请求接口数据 //获取天气详细信息 public JsonResult GetWeatherDetails( ...
- springMVC(1)---获取前段数据
springMVC(1)---获取前段数据 首先说明,如果你学过Struts2,那么在学springMVC就会简单很多,我也不最基础的开始写了,我前篇文章搭建了个ssm框架,算是springmvc入门 ...