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这种模式,是以字节的形式操作,需要 ...
随机推荐
- IntelliJ IDEA(一) :安装
前言 我是从eclipse转IDEA的,对于习惯了eclipse快捷键的我来说,转IDEA开始很不习惯,IDEA快捷键多,组合多,记不住,虽然可以设置使用eclipse的快捷键,但是总感觉怪怪的.开始 ...
- CCF-201509-2-日期计算
问题描述 试题编号: 201509-2 试题名称: 日期计算 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给定一个年份y和一个整数d,问这一年的第d天是几月几日? 注意闰年 ...
- linux 下配置静态IP
设置静态网络如下[root@bogon network-scripts]# pwd 进入这个路径下 /etc/sysconfig/network-scripts [root@bogon network ...
- Scala入门系列(八):面向对象之trait
基础知识 1 将trait作为接口使用 此时Trait就与Java中的接口非常类似,不过注意,在Scala中无论继承还是trait,统一都是extends关键字. Scala跟Java 8前一样不支持 ...
- CORS预检请求详谈
引言 最近在项目中因前后端部署不同地方,前端在请求后端api时发生了跨域请求,我们采用CORS(跨域资源共享)来解决跨域请求,这需要前后端的配合来完成.在这一过程中,后端支持了CORS跨域请求后,前端 ...
- 二叉树的递归遍历 天平UVa839
题意:输入一个树状的天平,利用杠杆原理,根据力矩是否相等(W1D1==W1D2)判断天平是否平衡 解题思路:1.由于判断天平是否平衡,当W1和W2都为0的时候,会先输入左子树,再输入右子树 2.此时的 ...
- xxx金融后台管理系统详细版:包括本地开发调试详细步骤
效果演示地址, github地址: demo演示: 1.About 此项目是 vue2.0 + element-ui + node+mongodb 构建的后台管理系统,所有的数据都是从 ...
- em标签和strong标签的区别
今天模拟面试,第一个问题就是这个,然后我回答说就是表示强调,然后老师说还有吗,我说不知道了,然后,就没有然后了... 第一个层次的区别: <em>标签是告诉浏览器把其中的文本表示为强调的内 ...
- ASP.MVC当URL跳转时候参数的安全性
一个页面跳转到另外一个页面直接将参数写在URL上面并不安全比如 http://XXXXXXXXXXX/meeting/shakeGroup?id=5381&uid=o0En_sj1J0bFgI ...
- 跨平台应用集成(在ASP.NET Core MVC 应用程序中集成 Microsoft Graph)
作者:陈希章 发表于 2017年6月25日 谈一谈.NET 的跨平台 终于要写到这一篇了.跨平台的支持可以说是 Office 365 平台在设计伊始就考虑的目标.我在前面的文章已经提到过了,Micro ...