正则表达式(或RE)指定一组匹配它字符串;此模块中的函数让你检查一个特定的字符串是否匹配给定的正则表达式(或给定的正则表达式是否匹配特定的字符串)。
¶基本语法
¶re.match 从头匹配
原型: match(pattern,string,flags=0)
参数:
patter:匹配的正则表达式
string:要匹配的字符串
flags:标志位,控制正则表达式匹配方式有如下:
1 | re.I 使匹配对大小写不敏感 |
功能: 从头开始匹配返回第一个匹配对象,匹配失败返回None
Demo:
1 | print(re.match('www', 'www.Darr_en1.com').group()) #www |
¶re.search 匹配包含
原型: search(pattern,string,flags=0)
功能: 扫描整个字符串返回第一个匹配对象,匹配失败返回None
Demo:
1 | print(re.search('www', 'www.Darr_en1.com').group()) #www |
¶re.compile 预编译
原型: compile(pattern,flags=0)
功能: 把正则表达式编译成一个正则对象
¶在看《python核心编程》(第3版)对于编译的说法,深有体会,以下摘录:
编译正则表达式(编译还是不编译?)
在 Core Python Programming 或者即将出版的 Core Python Language Fundamentals 的执行环境章节中,介绍了Python代码最终如何被编译成字节码,然后在解释器上执行。特别是,我们指定 eval()或者 exec(在 2.x 版本中或者在 3.x 版本的 exec()中)调用一个代码对象而不是一个字符串,性能上会有明显提升。这是由于对于前者而言,编译过程不会重复执行。换句话说,使用预编译的代码对象比直接使用字符串要快,因为解释器在执行字符串形式的代码前都必须把字符串编译成代码对象。
同样的概念也适用于正则表达式—在模式匹配发生之前,正则表达式模式必须编译成正则表达式对象。由于正则表达式在执行过程中将进行多次比较操作,因此强烈建议使用预编译。而且,既然正则表达式的编译是必需的,那么使用预编译来提升执行性能无疑是明智之举。re.compile()能够提供此功能。
其实模块函数会对已编译的对象进行缓存,所以不是所有使用相同正则表达式模式的 search()和 match()都需要编译。即使这样,你也节省了缓存查询时间,并且不必对于相同的字符串反复进行函数调用。在不同的 Python 版本中,缓存中已编译过的正则表达式对象的数目可能不同,而且没有文档记录。purge()函数能够用于清除这些缓存。
Demo:
1 | re_obj = re.compile("www") |
¶re.findall 匹配包含返回列表
原型: findall(pattern,string,flags=0)
功能: 扫描整个字符串返回结果列表,匹配失败返回None
Demo:
1 | mail='<Darr_en101@mail.com> <Darr_en102@mail.com> Darr_en103@mail.com' |
¶re.finditer 匹配包含返回迭代器
原型: findall(pattern,string,flags=0)
功能: 扫描整个字符串返回迭代器,可防止内存过大现象
Demo:
1 | mail='<Darr_en101@mail.com> <Darr_en102@mail.com> Darr_en103@mail.com' |
¶re.split 以匹配到的字符当做列表分隔符
原型: split(pattern, string, maxsplit=0, flags=0)
参数: maxsplit:最大分割字符串,默认为0,表示每个匹配项都分割
Demo:
1 | str ="Darr_en1 is so cool" |
¶re.sub 替换字符串的匹配项
原型: sub(pattern, repl, string, count=0)
参数:
rep1:替换后的字符串
count:替换个数,默认为0,表示每个匹配项都替换
功能: 替换字符串的匹配项,返回str
Demo:
1 | str="Darr_en1 is so cool" |
¶re.subn 替换字符串的匹配项
原型: subn(pattern, repl, string, count=0)
参数:
rep1:替换后的字符串
count:替换个数,默认为0,表示每个匹配项都替换
功能: 替换字符串的匹配项,返回tuple,第一个值为被替换的str,第二个值为被替换次数
Demo:
1 | str="Darr_en1 is so cool" |
¶group() groups() 分组
功能: 通过()来进行分组,group(n)返回第n个值,groups()返回tuple
Demo:
1 | str="Darr_en1-is-so-cool" |
¶常用正则表达式符号
¶单个字符
1 | '.' 匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行 |
¶预定义字符集
1 | '\d' 匹配数字[0-9] |
¶锚字符(边界字符)
1 | '^' 匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE) |
¶量数词(匹配多个字符)
1 | '*' 匹配*号前的字符0次或多次,re.findall("ab*","cabb3abcbbac") 结果为['abb', 'ab', 'a'] |
¶贪婪匹配 非贪婪匹配
1 | 贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配。 |