Python标准库笔记(2) — re模块
re模块提供了一系列功能强大的正则表达式(regular expression)工具,它们允许你快速检查给定字符串是否与给定的模式匹配(match函数), 或者包含这个模式(search函数)。正则表达式是以紧凑(也很神秘)的语法写出的字符串模式。
1. 常用方法
常用方法 | 描述 |
---|---|
match(pattern, string, flags=0) | 如果字符串string的开头和正则表达式pattern匹配返回相应的MatchObject的实例,否则返回None |
search(pattern, string, flags=0) | 扫描string,如果有个位置可以匹配正则表达式pattern,就返回一个MatchObject的实例,否则返回None |
sub(pattern, repl, string, count=0, flags=0) | 将string里匹配pattern的部分,用repl替换掉,最多替换count次 |
subn(pattern, repl, string, count=0, flags=0) | 和sub类似,subn返回的是一个替换后的字符串和匹配次数组成的元组 |
split(pattern, string, maxsplit=0, flags=0) | 用pattern匹配到的字符串来分割string |
findall(pattern, string, flags=0) | 以列表的形式返回string里匹配pattern的字符串 |
compile(pattern, flags=0)compile(pattern, flags=0) | 把一个正则表达式pattern编译成正则对象,以便可以用正则对象的match和search方法 |
purge() | Clear the regular expression cache |
escape(string) | 把string中除了字母和数字以外的字符,都加上反斜杆 |
2. 特殊匹配符
语法 | 说明 |
---|---|
. | 匹配除了换行符外的任何字符 |
^ | 头匹配 |
$ | 尾匹配 |
* | 匹配前一个字符0次或多次 |
+ | 匹配前一个字符1次或多次 |
? | 匹配前一个字符0次或一次 |
{m,n} | 匹配前一个字符m至n次 |
\ | 对任一特殊字符进行转义 |
[] | 用来表示一个字符集合 |
| | 或,代表左右任意匹配一个 |
3. 模块方法
re.match(pattern, string, flags=0)
从字符串的开始匹配,如果pattern匹配到就返回一个Match对象实例(Match对象在后面描述),否则放回None。flags为匹配模式(会在下面描述),用于控制正则表达式的匹配方式。
import re
a = 'abcdefg'
print re.match(r'abc', a) # 匹配成功
print re.match(r'abc', a).group()
print re.match(r'cde', a) # 匹配失败
>>><_sre.SRE_Match object at 0x0000000001D94578>
>>>abc
>>>None
search(pattern, string, flags=0)
用于查找字符串中可以匹配成功的子串,如果找到就返回一个Match对象实例,否则返回None。
import re
a = 'abcdefg'
print re.search(r'bc', a)
print re.search(r'bc', a).group()
print re.search(r'123', a)
>>><_sre.SRE_Match object at 0x0000000001D94578>
>>>bc
>>>None
sub(pattern, repl, string, count=0, flags=0)
替换,将string里匹配pattern的部分,用repl替换掉,最多替换count次(剩余的匹配将不做处理),然后返回替换后的字符串。
import re
a = 'a1b2c3'
print re.sub(r'\d+', '0', a) # 将数字替换成'0'
print re.sub(r'\s+', '0', a) # 将空白字符替换成'0'
>>>a0b0c0
>>>a1b2c3
subn(pattern, repl, string, count=0, flags=0)
跟sub()函数一样,只是它返回的是一个元组,包含新字符串和匹配到的次数
import re
a = 'a1b2c3'
print re.subn(r'\d+', '0', a) # 将数字替换成'0'
>>>('a0b0c0', 3)
split(pattern, string, maxsplit=0, flags=0)
正则版的split(),用匹配pattern的子串来分割string,如果pattern里使用了圆括号,那么被pattern匹配到的串也将作为返回值列表的一部分,maxsplit为最多被分割的字符串。
import re
a = 'a1b1c'
print re.split(r'\d', a)
print re.split(r'(\d)', a)
>>>['a', 'b', 'c']
>>>['a', '1', 'b', '1', 'c']
findall(pattern, string, flags=0)
以列表的形式返回string里匹配pattern的不重叠的子串。
import re
a = 'a1b2c3d4'
print re.findall('\d', a)
>>>['1', '2', '3', '4']
4. Match对象
re.match()、re.search()成功匹配的话都会返回一个Match对象,它包含了很多此次匹配的信息,可以使用Match提供的属性或方法来获取这些信息。例如:
>>>import re
>>>str = 'he has 2 books and 1 pen'
>>>ob = re.search('(\d+)', str)
>>>print ob.string # 匹配时使用的文本
he has 2 books and 1 pen
>>>print ob.re # 匹配时使用的Pattern对象
re.compile(r'(\d+)')
>>>print ob.group() # 获得一个或多个分组截获的字符串
2
>>>print ob.groups() # 以元组形式返回全部分组截获的字符串
('2',)
5.Pattern对象
Pattern对象对象由re.compile()返回,它带有许多re模块的同名方法,而且方法作用类似一样的。例如:
>>>import re
>>>pa = re.compile('(d\+)')
>>>print pa.split('he has 2 books and 1 pen')
['he has ', '2', ' books and ', '1', ' pen']
>>>print pa.findall('he has 2 books and 1 pen')
['2', '1']
>>>print pa.sub('much', 'he has 2 books and 1 pen')
he has much books and much pen
6.匹配模式
匹配模式取值可以使用按位或运算符’|’表示同时生效,比如re.I | re.M, 下面是常见的一些flag。
- re.I(re.IGNORECASE): 忽略大小写
>>>pa = re.compile('abc', re.I)
>>>pa.findall('AbCdEfG')
>>>['AbC']
- re.L(re.LOCALE):字符集本地化
这个功能是为了支持多语言版本的字符集使用环境的,比如在转义符\w
,在英文环境下,它代表[a-zA-Z0-9]
,即所以英文字符和数字。如果在一个法语环境下使用,有些法语字符串便匹配不上。加上这L选项和就可以匹配了。不过这个对于中文环境似乎没有什么用,它仍然不能匹配中文字符。
- re.M(re.MULTILINE): 多行模式,改变’^’和’$’的行为
>>>pa = re.compile('^\d+')
>>>pa.findall('123 456\n789 012\n345 678')
>>>['123']
>>>pa_m = re.compile('^\d+', re.M)
>>>pa_m.findall('123 456\n789 012\n345 678')
>>>['123', '789', '345']
- re.S(re.DOTALL): 点任意匹配模式,改变’.’的行为
.
号将匹配所有的字符。缺省情况下.
匹配除换行符\n
外的所有字符,使用这一选项以后,点号就能匹配包括换行符的任何字符。
re.U(re.UNICODE): 根据Unicode字符集解析字符
re.X(re.VERBOSE): 详细模式
# 这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释。以下两个正则表达式是等价的
a = re.compile(r"""\d + # the integral part
\. # the decimal point
\d * # some fractional digits""", re.X)
b = re.compile(r"\d+\.\d*")
# 但是在这个模式下,如果你想匹配一个空格,你必须用'/ '的形式('/'后面跟一个空格)
Python标准库笔记(2) — re模块的更多相关文章
- Python标准库笔记(11) — Operator模块
Operator--标准功能性操作符接口. 代码中使用迭代器时,有时必须要为一个简单表达式创建函数.有些情况这些函数可以用一个lambda函数实现,但是对于某些操作,根本没必要去写一个新的函数.因此o ...
- Python标准库笔记(10) — itertools模块
itertools 用于更高效地创建迭代器的函数工具. itertools 提供的功能受Clojure,Haskell,APL和SML等函数式编程语言的类似功能的启发.它们的目的是快速有效地使用内存, ...
- Python标准库笔记(9) — functools模块
functools 作用于函数的函数 functools 模块提供用于调整或扩展函数和其他可调用对象的工具,而无需完全重写它们. 装饰器 partial 类是 functools 模块提供的主要工具, ...
- Python标准库笔记(8) — pprint模块
struct模块提供了用于在字节字符串和Python原生数据类型之间转换函数,比如数字和字符串. Python版本: 2.x & 3.x 该模块作用是完成Python数值和C语言结构体的Pyt ...
- Python标准库笔记(6) — struct模块
该模块作用是完成Python数值和C语言结构体的Python字符串形式间的转换.这可以用于处理存储在文件中或从网络连接中存储的二进制数据,以及其他数据源. 用途: 在Python基本数据类型和二进制数 ...
- Python 标准库笔记(1) — String模块
原文出处: j_hao104 String模块包含大量实用常量和类,以及一些过时的遗留功能,并还可用作字符串操作. 1. 常用方法 常用方法 描述 str.capitalize() 把字符串的首字母大 ...
- (转)Python 标准库笔记:string模块
String模块包含大量实用常量和类,以及一些过时的遗留功能,并还可用作字符串操作. 原文:http://www.10tiao.com/html/384/201709/2651305041/1.htm ...
- Python标准库笔记(1) — string模块
String模块包含大量实用常量和类,以及一些过时的遗留功能,并还可用作字符串操作. 1. 常用方法 常用方法 描述 str.capitalize() 把字符串的首字母大写 str.center(wi ...
- Python标准库笔记(4) — collections模块
这个模块提供几个非常有用的Python容器类型 1.容器 名称 功能描述 OrderedDict 保持了key插入顺序的dict namedtuple 生成可以使用名字来访问元素内容的tuple子类 ...
- Python标准库笔记(3) — datetime模块
datetime模块提供了简单和复杂的方式用于操纵日期和时间的类.虽然支持日期和时间运算,但实现的重点是为了输出格式化和操作高效地提取属性. 1. 模块内容 内容 描述 常量 datetime.M ...
随机推荐
- SQL SERVER 存储过程中SELECT 返回值如何赋值给变量
今天在处理一个问题时,使用到一个存储过程,是用于更新并获取最新ID的.在使用过程中,需要获取到这个ID并赋值给变量,结果用EXEC @ID = 存储过程的方式获取失败了.具体情况如下: 为了还原整个情 ...
- Java线程常用方法详解
线程的常用方法 1.start() : 线程调用该方法将启动线程,使之从新建状态进入就绪队列排队,一旦轮到它来享用CPU资源时,就可以脱离创建它的线程独立开始自己的生命周期了. 2.run(): Th ...
- es6常用基础合集
es6常用基础合集 在实际开发中,ES6已经非常普及了.掌握ES6的知识变成了一种必须.尽管我们在使用时仍然需要经过babel编译. ES6彻底改变了前端的编码风格,可以说对于前端的影响非常巨大.值得 ...
- CentOS 压缩(打包)和解压
1.tar命令 -c 创建压缩文件 -x 解开压缩文件 -t 查看压缩包内有哪些文件 -z 用 Gzip压缩或解压 -j 用 bzip2压缩或解压 -v 显示压缩或解压的过程 -f 目标文件名,在 f ...
- [CQOI2014]数三角形 组合数 + 容斥 + gcd
推导过程 : 组合数+容斥原理+gcd 正确做法是暴力的一种优化,ans=所有情况 - 平行坐标轴的三点共线 - 斜线三点共线 如果快速求斜线三点共线: 首先要知道一个结论,对于点(a,b) (x,y ...
- BZOJ2830 & 洛谷3830:[SHOI2012]随机树——题解
https://www.luogu.org/problemnew/show/P3830#sub <-题面看这里~ https://www.lydsy.com/JudgeOnline/prob ...
- BZOJ1412 [ZJOI2009]狼和羊的故事 【最小割】
1412: [ZJOI2009]狼和羊的故事 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 3454 Solved: 1733 [Submit][ ...
- [BZOJ3523][Poi2014]KLO-Bricks——全网唯一 一篇O(n)题解+bzoj最优解
Description 有n种颜色的砖块,第i种颜色的砖块有a[i]个,你需要把他们放成一排,使得相邻两个砖块的颜色不相同,限定第一个砖块的颜色是start,最后一个砖块的颜色是end,请构造出一种合 ...
- 关于EK Dicnic
笔记--最大流 $EK$ $Dinic$ $EK$: 运用反向边可以给当前图一次反悔的机会,就是其实现在的增广路并不是最优的,然后就$bfs$找增广路即可 $Dicnic$: 我们发现其实每一次先$ ...
- windows内存映射文件
http://shushanyegui.duapp.com/?p=731 在描述内存映射文件之前 我们先来写一个系统通过I/O来读写磁盘文件的小程序 #include "stdafx.h&q ...