在介绍正则表达式之前我们先认识一下re模块
re模块: python提供的专门使用正则表达式的相关的函数的模块
1.什么是正则表达式?
正则表达式是一种让字符处理更简单的工具(本质是做字符串匹配)
2.正则表达式的语法
from re import fullmatch, search, findall fullmatch(正则表达式, 字符串) - 让正则表达式式和字符串进行完全匹配,如果匹配失败结果是None js的正则: /正则表达式/ python的正则: r'正则表达式'1) 匹配符号
①普通字符 - 表示字符本身
re_str = r'abc' result = fullmatch(re_str,'abc') print(result) # <_sre.SRE_Match object; span=(0, 3), match='abc'>② . - 匹配一个任意字符
re_str = r'.abc' result = fullmatch(re_str, '+abc') print(result) # <_sre.SRE_Match object; span=(0, 4), match='+abc'>练习1: 匹配一个长度是5的字符串,字符串中间三个字符是abc,第一个字符和最后一个字符任意
re_str = r'.abc.' result = fullmatch(re_str, '(abc+') print(result) #<_sre.SRE_Match object; span=(0, 5), match='(abc+'>练习2: 匹配一个长度是3的任意字符串
re_str = r'...' result = fullmatch(re_str, 'ajs') print(result) # <_sre.SRE_Match object; span=(0, 3), match='ajs'>③\w - 匹配任意一个数字、字母或者下划线(针对ASCII码表有效)
(注意:平时不用)
re_str = r'\wabc' result = fullmatch(re_str, '8abc') print(result) # <_sre.SRE_Match object; span=(0, 4), match='8abc'>④\d - 匹配任意一个数字字符
re_str = r'\d\d\d' result = fullmatch(re_str, '142') print(result) # <_sre.SRE_Match object; span=(0, 3), match='142'>⑤\s - 匹配任意一个空白字符
re_str = r'\s\d..' result = fullmatch(re_str, '\n9k/') print(result) # <_sre.SRE_Match object; span=(0, 4),match='\n9k/'>⑥\D 和 \S
\字母 - 小写字母和对应的大写字母的功能相反
re_str = r'\dabc\D' result = fullmatch(re_str, '8abc-') print(result) #<_sre.SRE_Match object; span=(0, 5), match='8abc-'>⑦[字符集] - 匹配字符集中出现的任意一个字符
注意:一个[]只能匹配一个字符 a. [abc123] - 匹配 a、b、c、1、2、3 中任意一个字符 b. [a-z] - 匹配从字符a到字符z之间的任意一个字符(匹配任意一个小写字母) [A-Z] - 匹配任意一个大写字母 [a-zA-Z] - 匹配任意一个字母 [0-9] - 匹配任意一个数字字符 [\u4e00-\u9fa5] - 匹配任意一个中文字符练习3:判断输入手机号码是否合法
re_str = r'1[3-9]\d\d\d\d\d\d\d\d\d' result = fullmatch(re_str, '13598902763') print(result)练习4:写一个正则表达式,要求可以匹配一个字符串:abc前面是一个数字、字母或者下划线
re_str = r'[a-zA-Z\d_]abc' result = fullmatch(re_str, '_abc') print(result)⑧[^字符集] - 取不在字符集中任意一个字符
[^\u4e00-\u9fa5] - 匹配任意一个非中文字符 [^0-9] - 匹配任意一个非数字字符 [^a-zA-Z] - 匹配任意一个非字母字符 print(fullmatch(r'[abc^]123', 'b123')) print(fullmatch(r'[^abc]123', 'a123'))2) 检测符号
①\b - 检测是否是单词的边界
单词边界:字符串开头,字符串结尾,凡是能区分出两个不同单词的符号
注意:检测类的符号不影响匹配的长度,只是在匹配成功的时候做进一步的检测
message = 'how are you?i am fine!thank you!' re_str = r'\d\d.\b\d\d' print(fullmatch(re_str, '56=89')) # <_sre.SRE_Match object; span=(0, 5), match='56=89'>② ^ - 检测 ^ 所在的位置是否是字符串的开头
re_str = r'\d^abc' print(fullmatch(re_str, '1abc')) # None re_str = r'^\d\d\d' print(fullmatch(re_str, '678')) # <_sre.SRE_Match object; span=(0, 3), match='678'>③ $ - 检测$所在的位置是否是字符串结尾
re_str = r'\d\d$' print(search(re_str, '蜡笔7823小新89')) # <_sre.SRE_Match object; span=(8, 10), match='89'>3) 匹配次数
① * - 匹配0次或多次
re_str = r'a*' print(fullmatch(re_str, 'aaa')) # <_sre.SRE_Match object; span=(0, 3), match='aaa'>② + - 匹配一次或多次(至少一次)
re_str = r'a+' print(fullmatch(re_str, 'a')) # <_sre.SRE_Match object; span=(0, 1), match='a'>③ ? - 匹配0次或1次
re_str = r'\d?abc' print(fullmatch(re_str, '0abc')) # <_sre.SRE_Match object; span=(0, 4), match='0abc'>练习5: 写一个正则表达式可以匹配任意一个整数字符串
re_str = r'[-+]?\d+' print(fullmatch(re_str, '+23874')) # <_sre.SRE_Match object; span=(0, 6), match='+23874'>④ {}
{N} - 匹配N次 {M,N} - 匹配M到N次 {M,} - 匹配至少M次 {,N} - 匹配最多N次(0~N次) re_str = r'\d{4}abc' print(fullmatch(re_str, '6723abc')) # <_sre.SRE_Match object; span=(0, 7), match='6723abc'> re_str = r'a{2,5}123' print(fullmatch(re_str, 'aaaaa123')) # <_sre.SRE_Match object; span=(0, 8), match='aaaaa123'> re_str = r'a{2,}123' print(fullmatch(re_str, 'aaaaaaaaaaa123')) # <_sre.SRE_Match object; span=(0, 14), match='aaaaaaaaaaa123'> re_str = r'a{,2}123' print(fullmatch(re_str, 'aa123')) # <_sre.SRE_Match object; span=(0, 5), match='aa123'>4) 贪婪和非贪婪
在匹配次数不确定的情况下,匹配模式分为两种:贪婪和非贪婪
①贪婪:默认都是贪婪的(在能匹配到的前提下匹配次数尽可能多)
*、+、?, {M,N}、{M,}、{,N} 都是贪婪
②非贪婪:(在能匹配到的前提下匹配次数尽可能少)在匹配次数不确定的时候,次数后面加问号,匹配就是非贪婪的
*? 、+?、??、{M,N}?、{M,}?、{,N}? 都是非贪婪
5) 分支和分组
① 分支: |
语法: 正则1|正则2|正则3 # 写一个正则匹配一个字符串:123abc 和 456abc re_str = r'123abc|456abc' print(fullmatch(re_str, '456abc')) re_str = r'123|345abc' print(fullmatch(re_str, '123abc')) # None print(fullmatch(re_str, '123')) print(fullmatch(re_str, '345abc'))② 分组: ()
a.整体操作:
# abc出现3次 re_str = r'(abc){3}' print(fullmatch(re_str, 'abcabcabc')) # 写一个正则匹配一个字符串:123abc 和 456abc re_str = r'(123|456)abc' print(fullmatch(re_str, '456abc')) # 两个数字两个字母的结构重复4次: 34hj56kl67uj23Bm re_str = r'(\d\d[a-zA-Z]{2}){4}' print(fullmatch(re_str, '34hj56kl67uj23Bm'))b.重复: \M - 重复前面第M个分组匹配到的内容(M从1开始)
re_str = r'(\d\d)=\1abc' print(fullmatch(re_str, '67=67abc')) # <_sre.SRE_Match object; span=(0, 8), match='67=67abc'> re_str = r'(\d\d)-([a-z]{3})-\2-\1' print(fullmatch(re_str, '23-bnm-bnm-23')) # <_sre.SRE_Match object; span=(0, 13), match='23-bnm-bnm-23'>6) 转义符号:
在具有特殊功能或者特殊意义的符号前加 \ ,让功能消失
re_str = r'\.\d\d' print(fullmatch(re_str, '.23')) # <_sre.SRE_Match object; span=(0, 3), match='.23'> re_str = r'abc\+\d\d' print(fullmatch(re_str, 'abc+34')) # <_sre.SRE_Match object; span=(0, 6), match='abc+34'>注意: 独立存在有特殊功能的符号在[]中功能会自动消失
re_str = r'[-+.]abc' print(fullmatch(re_str, '.abc')) # <_sre.SRE_Match object; span=(0, 4), match='.abc'>