本文目录一览:
Python正则表达式之re.match()
我们在面对生物数据,比如序列信息(比如碱基序列、氨基酸序列等)的时候, 会时常要问,这其中是否包含着且含有多少某种已知的模式,一段DNA中是否包含转录起始特征TATA box、一段RNA中是否包含某种lncRNA、一段肽链中是否包含锌指结构等等;另一方面,我们在操作数据时,会时常遇到诸如把某个字符(对象)换成另一种字符(对象)的替换操作,而其本质还是如何搜索符合某种(替换)模式的对象。
在这些几乎天天都可以碰到的 模式匹配/搜索问题中,正则表达式就是一把解决问题的利剑!
在Python的re模块中,常用的有四个方法(match、search、findall、finditer)都可以用于匹配字符串,今天我们先来了解一下re.match()。
re.match()必须从字符串开头匹配! match方法尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。主要参数如下:
举个栗子来理解一下它的用法:
运行结果:
从例子中我们可以看出,re.match()方法返回一个匹配的对象,而不是匹配的内容。通过调用span()可以获得匹配结果的位置。而如果从起始位置开始没有匹配成功,即便其他部分包含需要匹配的内容,re.match()也会返回None。
一般一个小括号括起来就是一个捕获组。我们可以使用group()来提取每组匹配到的字符串。
group()会返回一个包含所有小组字符串的元组,从 0 到 所含的小组号。
直接调用groups()则直接返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。
再举一个栗子:
运行结果:
Python 标准库模块 - re
正则表达式引擎对正则表达式文本进行编译生成正则表达式对象,再由正则表达式对象对目标文本进行匹配,后返回匹配结果。
正则表达式中一共包含 2 中字符: 普通字符 、 元字符
匹配单个字符的元字符及其含义:
匹配重复性的元字符及其含义:
匹配位置的元字符及其含义:
分组匹配的元字符及其含义:
表示或运算的元字符:
转义元字符:
在 Python 中使用正则表达式,我们需要借助 re 模块提供的强大 API,下面我们就来学习几个 re 模块常用的接口吧~
参数说明: findall("正则表达式", "要匹配的字符串", flags=标志1|标志2|...)
返回值:以列表形式返回匹配到的字符串。
下面,我们用 findall 返回 Python 之禅中首尾用到的反义词:
运行结果:
当正则表达式中含有一个以上分组时, findall 返回的列表由元组构成,元组中包含每个分组匹配到的内容。如果只有一个分组,则返回由该分组匹配到的内容组所构成的列表:
match 函数返回的结果是一个 SRE_Match 对象:
SRE_Match 具有很多的属性,比如 .string 属性可以方便我们我获取在匹配时输入的字符串:
属性 .re 可以获取匹配时使用的编译后的正则表达式模式:
由于默认使用了 re.UNICODE ,所以我们这里的 \w 可以匹配中文字符。
属性 .regs 则以列表的形式返回正则表达式匹配到的内容以及各个分组陪陪到的内容,不过请注意,返回的都是索引的形式:
可以使用序列切片来看一下我们的正则表达式及其中的两个分组所匹配到的内容:
SRE_Match 对象也提供了非常多好用的方法,比如 groups 可以获取各个分组匹配到的内容:
group 则可以灵活地获取正则表达式或对应分组匹配到的内容:
如果使用的正则表达式定义了分组的名称, group 还可以通过名称获取相应分组匹配的内容:
在定义了分组的名称之后,还可以方便地使用 groupdict 以字典的形式返回所有分组匹配的结果:
最后需要注意的是, match 从字符串的开头开始匹配,如果开头不符合要求,则直接返回 None 。
与 match 匹配开头不同, search 匹配第一个符合规则的字符串,未成功则返回 None 。参数: re.search(pattern, string, flags=0) ;返回值同 match 。
在介绍 match 的使用时,最后一个例子,由于我们在字符串前面添加了 'PYTHON' 导致 match 使用原来的正则表达式无法匹配,返回 None 。此时,使用 search 就可以迎刃而解啦:
运行结果:
小结:
参数: re.split(pattern, string, maxsplit=0, flags=0) , split 功能非常强大,以正则表达式匹配到的标志来分隔字符串,比如下面这样一个混乱的字符串,我们要提取其中所有的数字:
下面,我们就来详细介绍一下 split 的用法。
首先,是以单字符切割:
以分号切割时,共产生了 4 个子字符串,放在列表中返回。
下面,还是以单字符切割,但可以使用正则表达式中的 [] 来指定多种字符:
由于字符串 line 中有连续的 2 个分号,逗号或者空格,因此可以使用 [;\s,]+ 来切割:
最后,上面的字符串在切割时,分隔符都没有被保留下来,使用括号捕获分组,即可保留分隔符:
re.sub 提供比字符串的 replace 方法更加强大的功能:对于输入的字符串 string ,利用正则表达式 pattern 强大的字符串处理功能,实现复杂的字符串替换处理为 repl ,返回被替换后的字符串。
下面的例子中,我们将句子中多余的空格和数字去掉:
如果想要知道替换过程中,共发生了多少次替换,可以使用 subn :
小结:
上述的案例中,我们每次都需要传入正则表达式,相应的函数每次在调用时,都需要编译一次正则表达式。如果上述过程需要多次重复,那么每次都去耗费时间编译正则表达式是很不划算的。
re 模块为我们提供了 compile 函数,用来编译正则表达式模式,返回编译好模式。因此,可以把那些常用的正则表达式编译成正则表达式对象,以提高效率。
格式: re.compile(pattern, flags=0) ,其中 pattern 为编译时用的表达式字符串, flags 为编译标志位,用于修改正则表达式的匹配方式,如:是否区分大小写,多行匹配等。常用的 flags 有:
注:使用按位或 | 连接多个 flags 。
我们上述介绍的 re 模块的匹配、分割、替换函数, compile 函数的返回值类提供了相应的方法,使用方式类似,只是不需要传入正则表达式字符串而已。
由于用法几乎一致,这里就不一一举例啦~
贪婪模式 : * + ? {m,n} ,正则表达式的重复默认总是尽可能多得向后匹配内容。
非贪婪模式 : *? +? ?? {m,n}? ,尽可能少的匹配内容。
Python re正则表达式模块及其用法
1.第一个参数是正则表达式,这里为"(\w+)\s",如果匹配成功,则返回一个Match,否则返回一个None;
2.第二个参数表示要匹配的字符串;
3.第三个参数是标致位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。 re.search函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回,如果...
4.第四个参数指替换个数。默认为0,表示每个匹配项都替换。 re.sub还允许使用函数对匹配...
Python模块的几种类型简介
1、系统内置模块
os模块:os模块包含普遍的操作系统功能
sys模块:提供了一系列有关Python运行环境的变量和函数
random模块:random模块用于生成随机数
time 模块: 主要包含各种提供日期、时间功能的类和函数
datetime模块:对time模块的一个高级封装
shutil模块:是一种高层次的文件操作工具
logging模块:将日志打印到了标准输出中
re模块:可以直接调用来实现正则匹配
pymysql模块:连接数据库,并实现简单的增删改查
threading模块:提供了更强大的多线程管理方案
queue模块:实现了多生产者,多消费者的队列
json模块:用于字符串和数据类型间进行转换json
2、开源(三方)模块
Requests:最富盛名的http库。每个Python程序员都应该有它。
Scrapy:从事爬虫相关的工作,这个库也是必不可少的。
NumPy:为Python提供了很多高级的数学方法。
matplotlib:一个绘制数据图的库。对于数据分析师非常有用。
Pygame:开发2D游戏的时候可以用上 。
Scapy:用Python写的数据包探测和分析库。
Django:开源Web开发框架,它鼓励快速开发,并遵循MVC设计,开发周期短。
Py2exe:将python脚本转换为windows上可以独立运行的可执行程序。
BeautifulSoup:基于Python的HTML/XML解析器,简单易用。
PyGtk:基于Python的GUI程序开发GTK+库。
3、自定义模块
自定义模块是自己写的模块,对某段逻辑或某些函数进行封装后供其他函数调用。
注意:自定义模块的命名一定不能和系统内置的模块重名了,否则将不能再导入系统的内置模块了。
例如:自定义了一个sys.py模块后,再想使用系统的sys模块是不能使用的。