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这种模式,是以字节的形式操作,需要 ...
随机推荐
- mysql单表多表查询
单表查询语法: select 字段1,字段2... from 表名where 条 件group by fieldhaving 筛选order by 字段limit 限制条数 关键字的优先级:from ...
- 乌龟棋dp
传送门题目:https://www.luogu.org/problem/show?pid=1541 其实这道题想到了就很简单,但很难想到用思维的dp,这非常少见. 看到每张牌不超过40张,这数据范围就 ...
- 手动安装Nginx
本分类下有一个环境一键安装.那这背后发生了什么呢?咱们手动使用源码进行安装.1.首先保证有一个能联网的centos.2.百度 ningx 官网 点download http://nginx.or ...
- java 之 单例模式(大话设计模式)
笔者记得去面试时曾被问起这个模式,当时还没有看过设计模式,对设计模式基本上一无所知,不过可以肯定的是笔者用过单例模式.当时回答的风马牛不相及,很尴尬. 也是从那时起,开始学习设计模式.今天所说的就是单 ...
- python项目依赖管理分享迁移后重建开发环境(一)virtualenv 和 pip
作者:Panda Fang 出处:http://www.cnblogs.com/lonkiss/p/rebuild-development-environment-with-virtualenv-an ...
- 逐步搭建Lamp环境之Linux的运行模式
首先先来看几个概念,分别是:单用户.单任务.多用户.多任务 单用户: 是指操作系统一般只能由一个人同时进行登录 单任务: 是指操作系统只能同时处理一个任务 多用户: 是指操作系统可以允许由多个用户同时 ...
- ubuntu 一些琐碎知识
2017/09/01 ubuntu下面配置git公钥 $ git config --global user.name "Your Name" $ git config --glob ...
- SQL-PL/SQL基础
SQL的4GL,对流程控制的支持不够,Oracle的PL/SQL是3GL.加入了流程控制.变量等支持能够在数据库层面上进行程序的设计. PL/SQL的特点 1.支持事务控制和SQL. 2.数据类型在S ...
- 跟着鬼哥学so改动,二,进行篇
图/文 听鬼哥说故事 继续上文的内容---------------------------------- 0x1:測试文件的编写 经过上一篇文章的基础学习,如今我们開始进行是用的部分. 既然我们能够 ...
- jsp内置对象 的使用范围和类型【说明】
jsp内置对象 jsp内置对象有以下9种,我们会在后面的章节中分别介绍他们.这9种对象例如以下: 名称 类型 使用范围 request javax.servlet.http.HttpServletRe ...