python之正则表达式re

概念

正则表达式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标志位

函数说明:扫描整个字符串并返回第一个成功的匹配,匹配成功返回一个匹配对象,否则返回none
函数语法:

1
re.search(pattern, string, flags=0)

match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,返回none,search匹配的是整个字符串,知道找到一个匹配

re.sub

函数说明:用于替换字符串中的匹配项
函数语法:

1
2
3
4
re.sub(pattern, repl,string,count=0,flags=0)
#pattern正则中的模式字符串
#repl替换的字符串,也可以为一个函数,前三个是必选参数
#count模式匹配后替换的最大次数,默认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
2
3
4
test = 'date 2019-12-20'
res = re.search(r'(\d{4})-(\d{2})-(\d{2})', test)
res.group()#'2019-12-20'
res.group(1)#'2019'

使用名称提取分组,形式:(?P)

1
2
3
test = 'date 2019-12-20'
res = re.search(r'(?P<year>\d{4})-(?P<mon>\d{2})-(?P<day>\d{2})', test)
res.group('year')#'2019'
编译

当我们使用正则表达式时,re模块内部会做两件事情
第一是编译正则表达式,如果正则表达式的字符串本身不合法,会报错
第二是用编译后的正则表达式去匹配字符串
一个正则表达式如果要重复使用多次,比如几千次,那出于效率的角度,可以先预编译正则表达式,这样使用的时候就不用编译这个步骤了

1
2
3
4
5
import re
#编译
res = re.compile(r'(\d{4})-(\d{2})-(\d{2})')
# 使用
res.match('2019-12-20').groups()

实例

匹配任意电子邮箱:

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')

总结

通过使用正则表达式,可以:
测试字符串内的模式
可以测试输入字符串,以查看字符串内是否出现电话号码或者信用卡号码

替换文本
可以使用正则表达式来识别文档中的特定文本,完全删除该文本或者用其他文本替换

从字符串中提取子字符串
可以查找文档内或者输入域内特定的文本

休息一下,喝杯咖啡,继续创作