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这种模式,是以字节的形式操作,需要 ...
随机推荐
- 【C#入门教案-02】用记事本编写第一个C#程序-Hello World
02-用记事本编写第一个C#程序-Hello World 广东职业技术学院 欧浩源 [1]进行.NET程序开发的最基本环境配备 .NET Framework + 代码编辑工具(记事本或Noetpad ...
- 【转】用systemJS+karma+Jasmine+babel环境去编写简单的ES6工程
原文链接:http://www.cnblogs.com/shuoer/p/7779131.html 用systemJS+karma+Jasmine+babel环境去编写简单的ES6工程 首先解释下什么 ...
- Java面试常见算法题
1.实现字符串反转 提供七种方案实现字符串反转 import java.util.Stack; public class StringReverse { public static String re ...
- LinuxRPM包安装
转载注明出处:原文地址 ## LinuxRPM包安装 二进制包(RPM包.系统默认包) RPM安装 rpm -ivh 包全名(查询依赖网址:http://www.rpmfind.net) -i(ins ...
- ELK介绍
为什么用到ELK: 一般我们需要进行日志分析场景:直接在日志文件中 grep.awk 就可以获得自己想要的信息.但在规模较大的场景中,此方法效率低下,需要集中化的日志管理,所有服务器上的日志收集汇总. ...
- 关于hue安装后出现KeyError: "Couldn't get user id for user hue"的解决方法
首先说明出现此问题的原因是因为你使用的root用户安装了hue,然后在root用户下使用的build/env/bin/supervisor,如下图所示那样: 知道了原因,就容易解决问题了.首先要创建个 ...
- MATLAB中最基本函数plot()的用法
1二维平面图形 1.1基本图形函数 画出一条正弦曲线和一条余弦曲线 1.1.1绘图参数表 y 黄- 实线. 点< 小于号 m 紫: 点线o 圆s 正方形 c 青-. 点划线x 叉号d 菱形 r ...
- JS对象属性命名规则
JS标识符的命名规则,即变量的命名规则: 标识符只能由字母.数字.下划线和'$'组成 数字不可以作为标识符的首字符 对象属性的命名规则 通过[]操作符为对象添加属性时,属性名称可以是任何字符串(包括只 ...
- java集合框架07——Map架构与源代码分析
前几节我们对Collection以及Collection中的List部分进行了分析,Collection中还有个Set,因为Set是基于Map实现的,所以这里我们先分析Map,后面章节再继续学习Set ...
- java并发编程的艺术——第一章总结
并发编程的挑战 1.1上下文切换 1.2死锁 1.3资源限制的挑战 1.4本章小结 1.1上下文切换 1.1.1多线程一定快吗 1.1.2测试上下文切换次数和时长 1.1.3如何减少上下文切换 1.1 ...