这是Python的独立模块,需要引入。
import re
1. 先说re函数
re.match(pattern, string, flags=0)
参数:pattern:匹配的正则表达式;string:要匹配的字符串;flags:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等,后面细说。
用法:匹配以xxx 开头 的字符串,匹配成功就返回对象,否则返回None
re.search(pattern, string, flags=0)
参数同上
用法:扫描整个字符串并返回 第一个 成功的 匹配 ,否则返回None
差异:re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。
re.sub(pattern, repl, string, count=0, flags=0)
参数:pattern : 正则中的模式字符串;repl : 替换的字符串,也可为一个函数;string : 要被查找替换的原始字符串;count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
用法:用于 替换 字符串中的匹配项。
re测试数据pile(pattern[, flags])
参数说明同上
用法:该函数用于 编译正则表达式 ,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用
findall(string[, pos[, endpos]])
参数:string : 待匹配的字符串;pos : 可选参数,指定字符串的起始位置,默认为 0;endpos : 可选参数,指定字符串的结束位置,默认为字符串的长度。
用法:在字符串中找到正则表达式所 匹配的所有 子串,并返回一个 列表 ,如果没有找到匹配的,则返回空列表。
差异: match 和 search 是匹配一次 findall 匹配所有。
2. flag说明(修饰符,可选标志)
re.I 忽略大小写,I代表IGNORECASE
re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 取决于当前的本地化设置,L代表LOCALE
re.M 多行模式,使用本标志后,‘^’和‘$’匹配行首和行尾时,会增加换行符之前和之后的位置,M代表MULTILINE
re.S 使 “.” 特殊字符完全匹配任何字符,包括换行;没有这个标志, “.” 匹配除了换行符外的任何字符,S代表DOTALL,即等同于re.DOTALL
re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库
re.X 为了增加可读性,忽略空格和 # 后面的注释,X代表VERBOSE,等同于re.VERBOSE
注:多个flag同时使用可以使用OR(|) 它们来指定,比如re.I | re.L
3. 正则匹配模式
3.1表达式举例以及‘r’
\\d-\\d\\d-\\d代表1个数字加'-'再加2个数字再加'-'再加1个数字,比如1-22-3
\\d{2}-\\d{3}-\\d{4}代表2个数字加'-'再加3个数字再加'-'再加4个数字,比如12-222-3456
如上,因为\是需要转义的,因此我们需要在'\'前再加上'\'表示
用'r'可以解决,r表示传入原始字符串,它不包括转义字符
比如\\d-\\d\\d-\\d=r'\d-\d\d-\d'
3.2 字符分类
\d? 0到9的任何数字 ,等价于 [0-9]?(记忆方法:digital数字的)
\D? 除0到9的数字以外的任何字符,等价于 [^0-9]
\w? 任何字母、数字或 下划线 字符(可以认为是匹配“单词”字符),等价于'[A-Za-z0-9_]'(记忆方法: word单词)
\W? 除字母、数字和下划线以外的任何字符 ,等价于 '[^A-Za-z0-9_]'
\s? 空格、制表符或换行符(可以认为是匹配“空白”字符) ,等价于 [ \f\n\r\t\v]?(记忆方法:Space,空格空白)
\S? 除空格、制表符和换行符以外的任何字符 ,等价于 [^ \f\n\r\t\v]
3.2语法
常用:
^匹配字符串的开头
$匹配字符串的末尾。
.匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。
.*.*的组合可以匹配所有字符
[...]用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k'
[^...]不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。
()用来表达分组,后面有举例
*匹配0次或多次,r'Bat(wo)*man',匹配wo0次或多次
+匹配1次或多次r'Bat(wo)*man',匹配wo至少1次或多次
?可选匹配,r'Bat(wo)?man',匹配wo0次或1次
{}花括号里的数字表示匹配次数,比如(AB){3},将匹配ABABAB,{AB}{2,4}将匹配ABAB,ABABAB,ABABABAB,(AB){,3}匹配0到3次的AB,(AB){5,}匹配5次或更多次的AB
|或关系,A | B 表示 A或B
贪心和非贪心模式
所谓贪心模式就是python的正则表达式尽可能的匹配最长的字符串,python默认是贪心的,如果需要匹配尽可能的最短字符串,在结束的花括号跟着一个问号r'(AB){3,5}'默认会先匹配最长的,r'(AB){3,5}?'默认匹配最短的
举例:
Greedystr='ABABABABAB' Greedyre=re测试数据pile(r'(AB){3,5}') Greedyre1=re测试数据pile(r'(AB){3,5}?') Greedy_result=Greedyre.search(Greedystr) Greedy_result1=Greedyre1.search(Greedystr) print('默认贪心模式:',Greedy_result.group()) print('修改为非贪心模式:',Greedy_result1.group())
结果:
默认贪心模式: ABABABABAB
修改为非贪心模式: ABABAB
3.3 ()分组,re的group用法
()可以对表达式进行分组,我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式
group(num=0),默认为0,可以输入多个组号
groups()返回一个包含所有小组字符串的元组
举例说明:
1.没有分组的情况
message='My?telephone?number?is?0731-8888-4321,?and?his?is?0733-5678-6666' phonenum=re测试数据pile(r'\d{4}-\d{4}-\d{4}')#编译正则表达式,\d代表数字,{4}表示匹配的个数为4,r代表传入原始字符串 search_result=phonenum.search(message)#search只返回以第一次命中的 findall_result=phonenum.findall(message)#返回所有命中的结果,返回的是列表 print('search的结果:',search_result.group()) print('findall的结果:',findall_result)
#结果 :
search的结果: 0731-8888-4321
findall的结果: ['0731-8888-4321', '0733-5678-6666']
2.有分组的情况,分组用()表示,返回的是元组
message='My?telephone?number?is?0731-8888-4321,?and?his?is?0733-5678-6666' phonenum=re测试数据pile(r'(\d{4})-(\d{4})-(\d{4})')#编译正则表达式,\d代表数字,{4}表示匹配的个数为4,分组多了括号(),这里分了三个组 search_result=phonenum.search(message)#search只返回以第一次命中的 findall_result=phonenum.findall(message)#返回所有命中的结果,返回的是列表 print('search的结果group:',search_result.group(),'search的结果指定group1,2:',search_result.group(1,2)) print('findall的结果:',findall_result)
#结果
search的结果group: 0731-8888-4321 search的结果指定group1,2: ('0731', '8888')
findall的结果: [('0731', '8888', '4321'), ('0733', '5678', '6666')]
3.有分组但匹配中有()的情况,‘(’要用转义字符,举例中电话号码加了括号
message='My?telephone?number?is?(0731)-8888-4321,?and?his?is?(0733)-5678-6666' phonenum=re测试数据pile(r'(\(\d{4}\))-(\d{4})-(\d{4})')#编译正则表达式,\d代表数字,{4}表示匹配的个数为4,分组多了括号(),这里分了三个组 search_result=phonenum.search(message)#search只返回以第一次命中的 findall_result=phonenum.findall(message)#返回所有命中的结果,返回的是列表 print('search的结果group:',search_result.group(),'search的结果指定group1,2:',search_result.group(1,2)) print('findall的结果:',findall_result)
#结果
search的结果group: (0731)-8888-4321 search的结果指定group1,2: ('(0731)', '8888')
findall的结果: [('(0731)', '8888', '4321'), ('(0733)', '5678', '6666')]