概念
正则表达式regular expression是一种描述字符序列的方法,是用于处理字符串的强大工具,检查字符串是否与某种模式匹配,比如用来检查一个串是否含有某种子串,将匹配子串替换,或者从某个串中取出符合某个条件的子串,正则表达式是由普通字符例如字母(a-z)和特殊字符组成的文字模式
表示数量的语法:
+
123+4,可以匹配12334,1233334,123333334,其中+代表前一个字符必须至少出现一次(一次或多次)
*
1234,可以匹配124,123334,123334,号表示前一个字符可以不出现,也可以出现一次或多次,是任何的意思
?
123?4,可以匹配1234,124,?号表示前面的字符最多只可以出现一次(0次或1次)
.*
表示任意匹配除换行符(\n,\r)之外的任何单个或多个字符
{m}
匹配前一个字符出现m次
{m,}
匹配前一个字符至少出现m次
{m,n}
匹配前一个字符出现m到n次
[]
表示范围,比如[a-zA-Z0-9] 匹配一个字母或者数字
[a-zA-Z0-9]*
匹配任意字母数字组成的字符串
a|b
匹配a或者b
边界定位符:
^
匹配输入字符串开始的位置,
$
匹配输入字符串结尾的位置
\b
匹配一个单词边界,即字与空格间的位置
\B
非单词边界匹配
特殊字符类:
.
匹配除\n之外的任何单个字符
\d
匹配一个数字字符,等价于[0-9]
\D
匹配一个非数字字符,等价于[^0-9]
\w
可以匹配一个字母或者数字下划线
\W
非字母数字下划线,也就是上一个的相反情况
python正则表达式
re模块使python语言拥有全部的正则表达式功能,import re
re.match
函数说明:从字符串的起始位置匹配一个模式,匹配成功返回一个匹配对象,否则返回none,通过group方法获取匹配的内容
函数语法:
1 | re.match(pattern, string, flags=0) #pattern要匹配的正则表达式,string要匹配的字符串,flags标志位 |
re.search
函数说明:扫描整个字符串并返回第一个成功的匹配,匹配成功返回一个匹配对象,否则返回none
函数语法:
1 | re.search(pattern, string, flags=0) |
match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,返回none,search匹配的是整个字符串,知道找到一个匹配
re.sub
函数说明:用于替换字符串中的匹配项
函数语法:
1 | re.sub(pattern, repl,string,count=0,flags=0) |
re.complie
函数说明:
compile函数用于编译正则表达式,生成一个正则表达式对象,供match和search函数使用。
compile根据一个模式字符串和可选的标志参数生成一个正则表达式对象,该对象拥有一系列方法用于正则表达式匹配和替换
函数用法:
1 | re.compile(pattern[, flags])#flags是可选 |
re.findall
函数说明:在字符串中找到正则所匹配的所有子串,并返回一个列表,如果没有找到匹配,则返回空列表
函数用法:
1 | re.findall(string[, pos[, endpos]]) |
re.finditer
函数说明:在字符串中找到正则所匹配的所有子串,并把他们作为一个迭代器返回
函数用法:
1 | re.finditer(pattern, string,flags=0) |
re.split
函数说明:按照能够匹配的子串将字符串分割后返回列表
函数用法:
1 | re.split(pattern,string[,maxsplit=0,flags=0])#maxsplit分隔次数,1代表分隔一次,默认0,不限制次数 |
标志位
python中的正则表达式修饰符,多个标志位可以通过按位OR|来指定
re.I
ignorecase 使匹配对大小写不敏感
re.L
locale 做本地化识别匹配,即特殊字符集以来当前环境
re.M
Multiline 多行匹配,影响^和$
re.S
使.匹配包括换行在内的所有字符
re.U
根据Unicode字符集解析字符,会影响\w,\W,\b,\B
re.X
通过给予更灵活的格式,以便似的正则表达式更加易于理解
分组
正则表达式的强大功能就是提取子串,用()表示要提取的分组
如果正则表达式中定义了组,可以在match对象上用group()方法提取子串,其中group(0)是代表原始字符串group(1)group(2)依次表示第一个子串,第二个子串
1 | test = 'date 2019-12-20' |
使用名称提取分组,形式:(?P
1 | test = 'date 2019-12-20' |
编译
当我们使用正则表达式时,re模块内部会做两件事情
第一是编译正则表达式,如果正则表达式的字符串本身不合法,会报错
第二是用编译后的正则表达式去匹配字符串
一个正则表达式如果要重复使用多次,比如几千次,那出于效率的角度,可以先预编译正则表达式,这样使用的时候就不用编译这个步骤了
1 | import re |
实例
匹配任意电子邮箱:
1 | re.match(r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9_-]+\.[a-zA-Z]+$', 'aaaaaaaa@gmail.com'): |
匹配任意电话号码:
1 | re.match(r'^\d{3}\-\d{3,8}$', '010-12345') |
总结
通过使用正则表达式,可以:
测试字符串内的模式
可以测试输入字符串,以查看字符串内是否出现电话号码或者信用卡号码
替换文本
可以使用正则表达式来识别文档中的特定文本,完全删除该文本或者用其他文本替换
从字符串中提取子字符串
可以查找文档内或者输入域内特定的文本