正则表达式

正则表达式(或 RE)是一种小型的、高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现,所以使用时要导入re模块。正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行。

先说几个元字符  . ^ $ * + ? { }

import re

ret = re.findall('t...r', 'hellotomorrow')
print(ret) # ['tomor'] ret = re.findall('^r.w', 'r1whellotomorr2w')
print(ret) # ['r1w'] ret = re.findall('r.w$', 'r1whellotomorr2w')
print(ret) # ['r2w'] ret = re.findall('abc*', 'abcccc') # 贪婪匹配[0,+oo]
print(ret) # ['abcccc']
ret = re.findall('abc*', 'ab') # 贪婪匹配[0,+oo]
print(ret) # ['ab'] ret = re.findall('abc+', 'abccc') # [1,+oo]
print(ret) # ['abccc'] ret = re.findall('abc?', 'abccc') # [0,1]
print(ret) # ['abc'] ret = re.findall('abc{1,4}', 'abccc')
print(ret) # ['abccc'] 贪婪匹配 ret=re.findall('abc*?','abcccccc')
print(ret)#['ab'] 当* + ?的后面再加上?的话就会变成惰性匹配

 

元字符:[ ]

import re
ret = re.findall('a[bc]d','abd')
print(ret)#['abd'],选b或c ret = re.findall('[a-z]','abd')
print(ret)#['a', 'b', 'd'],选出a到z的元素 ret = re.findall('[.*+]','a.b+c*')
print(ret)#['.', '+', '*'],消除某些元字符的特殊功能 ret = re.findall('[1-9]','adc51ca')
print(ret)#['5', '1'],选出1到9之间的数字 ret = re.findall('[^ab]','jnan21b')
print(ret)#['j', 'n', 'n', '2', '1'],选出除了a,b的元素 ret = re.findall('\dc','123 cad#4')
print(ret)#['1', '2', '3', '4'],选出数字

 

元字符的转义符

反斜杠后边跟元字符去除特殊功能,比如\.
反斜杠后边跟普通字符实现特殊功能,比如\d

\d  匹配任何十进制数;它相当于类 [0-9]。
\D 匹配任何非数字字符;它相当于类 [^0-9]。
\s  匹配任何空白字符;它相当于类 [ \t\n\r\f\v]。
\S 匹配任何非空白字符;它相当于类 [^ \t\n\r\f\v]。
\w 匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。
\W 匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_]
\b  匹配一个特殊字符边界,比如空格 ,&,#等

有一种特殊情况:

import re
m = re.findall('\bblow', 'blow')
print(m)#[]
m = re.findall('\\bblow', 'blow')
print(m)#['blow']
m = re.findall(r'\bblow', 'blow')
print(m)#['blow']

这是因为在python解释器中“\\”才相当于一个“\”,而光写一个“\”是不能被识别的。

元字符( )分组

ret = re.search('(?P<id>\d{3})/(?P<name>\w{2,3})', '233/cn')
print(ret.group())#233/cn
print(ret.group('id'))#

这段代码的意思是以‘/’为界限分为名为id(3个数字)和名为name(2个或3个字母)的两个组,其中(?P<XXX>)是固定的格式,但可以不用这种格式。如果没有用这种格式则没有办法按名字来访问组中的数据,按需求来选择是否要用。而search()是扫描整个string查找匹配,会扫描整个字符串并返回第一个成功的匹配。

re.compile()

compile()可以编译正则表达式模式,返回一个对象。可以把常用的正则表达式编译成正则表达式对象,方便后续调用及提高效率。

import re

ret = re.compile('(\d{3})/(\w{2,3})')
print(ret.search('233/cn').group())
#233/cn

re.match()

只检测是不是在string的开始位置匹配,若在开头检测不到,则返回空。

ret = re.match('','')
print(ret)
#<re.Match object; span=(0, 3), match='233'>
#可以通过ret.span()查看其终止点,通过ret.group()查看匹配到的内容。

re.search()

扫描整个string查找匹配,会扫描整个字符串并返回第一个成功的匹配.

import re

ret = re.compile('(\d{3})/(\w{2,3})')
print(ret.search('233/cn').group())
#233/cn,也可以像match那样用span和group

re.split()

原型是re.split(pattern, string, maxsplit=0)

通过正则表达式将字符串分离。如果用括号将正则表达式括起来,那么匹配的字符串也会被列入到list中返回。maxsplit是分离的次数,maxsplit=1分离一次,默认为0,不限制次数。

import re

ret = re.split('s','adsnjfsnja')
print(ret)
#['ad', 'njf', 'nja']

re.sub()

替换目标字符串中的部分内容,格式为sub('要匹配的类型','替换的内容','目标字符串','替换次数')

import re

ret = re.sub('\d','abc','1bd,2fg')
print(ret)#abcbd,abcfg
ret = re.sub('\d','abc','1bd,2fg',1)
print(ret)#abcbd,2fg

re.finditer()

把匹配到的内容放到一个迭代器中,返回一个迭代器对象。

import re

ret = re.finditer('\d','a1b2c3,4')
print(ret)#<callable_iterator object at 0x0000021C112E8240>
print(next(ret).group())#

从零开始的Python学习Episode 15——正则表达式的更多相关文章

  1. 从零开始的Python学习Episode 11——装饰器

    装饰器 装饰器是用来处理其他函数的函数,主要作用是在不修改原有函数的情况下添加新的功能,装饰器的返回值也是一个函数对象. 简单的装饰器 import time def show_time(f): de ...

  2. 从零开始的Python学习Episode 23——进程

    ---恢复内容开始--- 进程 由于GIL的存在,python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程.Python提供了非常好用 ...

  3. 从零开始的Python学习Episode 22——多线程

    多线程 线程 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务. ...

  4. 从零开始的Python学习Episode 20——面向对象(3)

    面向对象之封装 封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别:将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体. 隐藏 在python中用双下划线开 ...

  5. 从零开始的Python学习Episode 19——面向对象(2)

    面向对象之继承 继承是一种创建新类的方式,新建的类可以继承一个或多个父类(python支持多继承),父类又可称 为基类或超类,新建的类称为派生类或子类. 子类会“”遗传”父类的属性,从而解决代码重用问 ...

  6. 从零开始的Python学习Episode 17——序列化

    序列化 我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语 言中也被称之为serialization,marshalling,flattenin ...

  7. 从零开始的Python学习Episode 16——模块

    一.模块 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相 ...

  8. 从零开始的Python学习Episode 13——常用模块

    模块 一.time模块 时间戳(timestamp) :时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量. 元组(struct_time)   :struct_time元组共有9 ...

  9. 从零开始的Python学习Episode 12——迭代器&amp;生成器

    生成器 列表生成式 用于快速地生成一个列表 a = [x*x for x in range(1,9)] print(a) #输出[1, 4, 9, 16, 25, 36, 49, 64] 也可以用于生 ...

随机推荐

  1. Entity Framework 6 Recipes 2nd Edition(13-7)译 -&gt; 返回只部分填充的实体

    问题 你有一个实体里的某个属性很少被读取或和更新,这个属性因为比较大,所以读取和更新都需要付很大的代价.你想有选择的放置这个属性 解决方案 假设你有一个如Figure 13-9 所示的模型 Figur ...

  2. ghj

    如果对同一个元素的定义有多种,以最接近(最小一级)的定义为最优先,例如有这么一段代码 Update: Lorem ipsum dolor set 在CSS文件中,你已经定义了元素p,又定义了一个cla ...

  3. CTSC2016&amp;&amp;APIO2016游记

    4.30 下午衡中放假,我们因为比赛的缘故提前到中午12:00放假 然后我爸爸说要来接我,直到下午两点多他才到,然后衡中宿舍的楼管阿姨死活不给我开门 莫名其妙的等到了三点多快四点的时候我才跟实验班的一 ...

  4. 使用日期工具类:DateUtil

    利用java开发,避免不了String.Date转换,前一天.后一天等问题.给出一个工具类,仅供学习交流. import java.text.DateFormat; import java.text. ...

  5. .NET平台和C#语言

    .NET平台的作用C#语言通过.NET平台来编写 部署 运行.NET应用程序. 为什么学习.NET语言1. C#语言是为.NET平台而生的.2. C#语言是完全面向对象的语言,所以一般情况下我们用C# ...

  6. effective c++ 条款8 prevent exception from leaving destructor

    1 析构函数绝对不要吐出异常.如果一个析构函数可能调用产生异常的函数,析构函数应该不传播该异常或结束程序 2 如果客户需要对某个操作函数运行期间抛出的异常做出反应,那么class应该提供一个普通函数执 ...

  7. hibernate学习(四)hibernate的一级缓存&amp;快照

    缓存:提高效率 硬件的 CPU缓存   硬盘缓存   内存 软件的  io流缓存 hibernate  的一级缓存   也是为了操作数据库的效率. 证明一级缓存在  : Person p=sessio ...

  8. jQuery Ajax 使用 ($.ajax、$.post、$.get)

    项目中只要涉及到前后台的交互,数据状态之间的交互,ajax是必不可少的.一般项目中jquery方式的ajax用的还是比较多的.封装的比较好,用起来也顺手,兼容浏览器之间的差异. 操作的方式有三种: 1 ...

  9. 【Unity游戏开发】浅谈Lua和C#中的闭包

    一.前言 目前在Unity游戏开发中,比较流行的两种语言就是Lua和C#.通常的做法是:C#做些核心的功能和接口供Lua调用,Lua主要做些UI模块和一些业务逻辑.这样既能在保持一定的游戏运行效率的同 ...

  10. VMware使两台windows虚拟机能够互相ping通

    1.关闭防火墙 cmd命令行里输入:netsh firewall set opmode disable 2.测试如果还不能ping通,就把网络类型选nat类型 3.测试:vmware网关默认是.2