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这种模式,是以字节的形式操作,需要 ...
随机推荐
- 服务器获取浏览器发送请求中的cookies,选取自己需要的cookie
String cookieName = “userID”; // 设置自己需要的cookie名 Cookie cookies[] = request.getCookies(); // 获取请求中的所有 ...
- php接入支付宝的流程
php接入支付宝的流程写在这里供像我一样的小白参考. 1.首先要有一个创建一个应用(选好自己想要的功能,关于支付的功能,貌似都需要签约) 2.下载SDK&Dome(网址https://doc. ...
- 高质量PHP代码的50个实用技巧必备(下)
26. 避免直接写SQL, 抽象之 不厌其烦的写了太多如下的语句: ? 1 2 <span style="color:#333333;font-family:''Helvetica, ...
- fiddler+android抓包工具配置使用
今天临时增加一个工作,手机需要抓包,查看了不同的抓包工具,最后确定使用fiddler抓包工具进行操作,这里以android为例记录一下工具的配置和使用操作. fiddler的安装 网上有很多fiddl ...
- js 深拷贝和浅拷贝
js 深拷贝和浅拷贝 先举一下项目中遇到的两个例子: 例子1: var json = $.parseJSON(data.data);//data.data是接口返回的值var a = json.cha ...
- Codeforces 850C Arpa and a game with Mojtaba
题意:给定一个正整数序列,两人轮流对这个数列进行如下修改:选取一个素数p和一个整数k将序列中能整除p^k的数除以p^k,问谁有必胜策略. 借此复习一下sg函数吧,sg(x) = mex ( sg(y) ...
- Xamarin 使用极光推送 详细教程
源码下载地址:http://download.csdn.net/download/kendocross/8677263 有兴趣的看以去看看 一.首先新建一个Xamarin.Android 项目,过程 ...
- 一个看起来不像中年人的中年人,带着两个初出茅庐的小伙子儿,用git管理项目代码的进击之路
一个中年人的孤独前行 我们这一代人,是上个世纪的人,活在当下,已然成为社会上的中流砥柱. 80年代生人,遥望我们的父辈,均是5.60年代的人,迟迟暮年,夕夕老矣.而我们,正当年,却又时光飞逝,很快便要 ...
- textarea高度自适应,随着内容增加高度增加
$(function(){ $.fn.autoHeight = function(){ function autoHeight(elem){ ...
- --------------Hibernate学习(四) 多对一映射 和 一对多映射
现实中有很多场景需要用到多对一或者一对多,比如上面这两个类图所展现出来的,一般情况下,一个部门会有多名员工,一名员工只在一个部门任职. 多对一关联映射 在上面的场景中,对于Employee来说,它跟D ...