Python3基础-正则表达式&re模块
正则表达式
定义:
即高级文本匹配模式,提供了搜索,替代等功能,本质是由一些字符和特殊符号组成的字串。这个字串描述了字符和字符的重复行为,可以匹配某一类特征的字符串集合。
re.findall(regex,string)
功能 : 使用正则表达式匹配字符串
参数 : regex : 正则表达式
string : 目标字符串
返回值 : 匹配到的内容
一 、元字符
(1) 普通字符
匹配规则 : 匹配相应的普通字符
data =re.findall('susu','hello, my name is susu\n') print(data) #输出 ['susu']
(2)匹配单一字符 .
匹配规则: 匹配任意一个字符 '\n'除外
data =re.findall('susg','hello, my name is susu\n') print(data) #输出 [] data =re.findall('s.s','hellomynameissusu\n') print(data) #输出 ['sus'] data =re.findall('s..s','hellomynameissusu\n') print(data) #输出 ['ssus'] data =re.findall('su','hellomynameissusu\n') print(data) #输出 ['su', 'su']
(3)匹配字符串开头 ^
data =re.findall('^h...o','hellomynameissusu') #以h 开头 print(data) #输出 ['hello']
(4)匹配字符串结尾 $
data =re.findall('h...o$','hellomynameissusu') #以o 结尾 print(data) #输出[] data =re.findall('s...o$','hellomynameissusuo') #以o 结尾 print(data) #输出['susuo']
(5)匹配重复0次或多次 *
data =re.findall('d*','hedllodmynddddddameissusud') #d 重复零次或更多次 print(data) #输出['', '', 'd', '', '', '', 'd', '', '', '', 'dddddd', '', '', '', '', '', '', '', '', '', 'd', ''] data =re.findall('my*','hedllodmynddddddameissusud') #y 重复零次或更多次 print(data) #输出 ['my', 'm']
(6)匹配重复1次或多次 +
data =re.findall('d+','hedllodmynddddddameissusud') #d 重复一次或者更多次 print(data) #输出['d', 'd', 'dddddd', 'd']
(7)匹配重复0次或1次 ?
data =re.findall('d?','hedllodmynddddddameissusud') #d 重复零次或者一次 print(data) #输出['', '', 'd', '', '', '', 'd', '', '', '', 'd', 'd', 'd', 'd', 'd', 'd', '', '', '', '', '', '', '', '', '', 'd', ''] data =re.findall('hed?','hedllodmynddddddameissusud') #d 重复零次或者一次 print(data) #输出['hed'] data =re.findall('su?','hedllodmyndudddddameissusud') #u 重复零次或者一次 print(data) #输出['s', 'su', 'su']
(8)匹配重复指定次数{N}
data =re.findall('su{1}','hedllodmynduddddsuudameissusud') #u 重复一次 print(data) #输出['su', 'su', 'su'] data =re.findall('su{2}','hedllodmynduddddsuudameissusud') #u 重复两次 print(data) #输出['suu']
(9)匹配重复指定次数范围{N,} {N,M}
data =re.findall('su{1,}','hedllodmynduddddsuudameissusud') #u 重复1次或者更多次 print(data) #输出['suu', 'su', 'su'] data =re.findall('su{1,}','hedllodmynduddddsuudameissusud') #u 重复1次或者更多次 print(data) #输出['suu', 'su', 'su'] data =re.findall('su{2,3}','hedllodmynduddddsuudameissusud') #u 重复2次或者3次 print(data) #输出['suu']
(10)字符集匹配 [ ]
元字符 : [abcd]
匹配规则 : 匹配中括号中的字符集区间 的一个字符
data=re.findall("www[oldbog baidu]","wwwbaidu") print(data) #输出['wwwb'] data=re.findall("www[baidu]","wwwbaidu") print(data) #输出['wwwb'] data=re.findall("www[baidu]","wwwbaiduwwwaibu") print(data) #输出['wwwb', 'wwwa'] data=re.findall("www[baidu]","sddwww") print(data) #输出[] data=re.findall("w[a-z]","wu") #a-z 任意字母 print(data) #输出['wu'] data=re.findall("w[a-zA-Z]","wuwO") #a-z 任意字母 A-Z任意字母 print(data) #['wu', 'wO'] data=re.findall("w[a-z]*","wu") #a-z 任意字母 print(data) #输出['wu'] data=re.findall("w[a-z]*","wue") #a-z 任意字母 print(data) #输出['wu'] data=re.findall("w[a-z]*","wuddddasdwqeqweqwee") #a-z 任意字母 print(data) #输出['wuddddasdwqeqweqwee'] data=re.findall("w[a-z]*","wudd9") #a-z 任意字母 print(data) #输出['wudd'] data=re.findall("w[0-9]*","wudd9") #a-z 任意字母 print(data) #输出['w']
(11)字符集不匹配
元字符 : [^ abc]
匹配规则 : 不匹配出字符集中字符的任意一个字符
data=re.findall("[^abcd]","abcdefghijk") print(data) #输出['e', 'f', 'g', 'h', 'i', 'j', 'k'] data=re.findall("w[^abcd]","wabcdefghijk") print(data) #输出[] data=re.findall("w[^abcd]","wefghijk") print(data) #输出['we']
(12)匹配任意数字(非数字)字符
元字符 : \d [0-9] \D [^0-9]
匹配规则: \d 匹配任意一个数字字符 \D 匹配任意非数字字符
data =re.findall('\d+','susu12sugh12haiyun38dddss60') # 匹配数字 重复一次或者更多次 print(data) #输出['12', '12', '38', '60'] data =re.findall('\D+','susu12sugh12haiyun38dddss60') # 匹配非数字 重复一次或者更多次 print(data) #输出['susu', 'sugh', 'haiyun', 'dddss']
(13)匹配任意普通字符(特殊字符)
元字符 : \w [_0-9a-zA-Z] \W [^_0-9a-zA-Z]
匹配规则 : \w 匹配数字字母下划线 \W 除了数字字母下划线
data =re.findall('\w+','susu12###~su_gh12###@@!haiyun38###%^&*dddss60()()苏苏88') #匹配字母或者数字或者下划线或者汉字 重复一次或者更多次 print(data) #输出['susu12', 'su_gh12', 'haiyun38', 'dddss60', '苏苏88'] data =re.findall('\W+','susu12###~su_gh12###@@!haiyun38###%^&*dddss60()()苏苏88') #匹配非字母或者数字或者下划线或者汉字 重复一次或者更多次 print(data) #输出['###~', '###@@!', '###%^&*', '()()']
(14)匹配任意 (非)空字符
元字符 : \s \S
匹配规则: \s 任意空字符 [ \n\0\t\r] 空格 换行 回车 制表
\S 任意非空字符
data =re.findall('\s+','susu12 sugh12 haiyun38 dddss60') # 匹配任意的空白符 重复一次或者更多次 print(data) #输出[' ', ' ', ' '] data =re.findall('\S+','susu12 sugh12 haiyun38 dddss60') # 匹配任意的非空白符 重复一次或者更多次 print(data) #输出['susu12', 'sugh12', 'haiyun38', 'dddss60']
(15)匹配字符串开头结尾
元字符 : \A ^ \Z $
匹配规则: \A 表示匹配字符串开头位置
\Z 表示匹配字符串的结尾位置
data =re.findall('\Ahai','susu12 sugh12 haiyun38 dddss60') print(data) #输出[] data =re.findall('\As','susu12 sugh12 haiyun38 dddss60') print(data) #输出['s'] data =re.findall('60\Z','susu12 sugh12 haiyun38 dddss60') print(data) #输出['60'] data =re.findall('\Ahello\Z','hello') print(data) #输出['hello'] data =re.findall('\Ahello\Z','helElo') print(data) #输出[]
(16)使用 或 多个正则 或者匹配
元字符 : |
匹配规则:匹配A或B
data =re.findall('ab|af','abdddddaf') print(data) #输出['ab', 'af'] data =re.findall('ab| af','abdddddaf') print(data) #输出['ab'] data =re.findall(' ab| af','abdddddaf') print(data) #输出[] data =re.findall('ab|ag','abdddddaf') print(data) #输出['ab']
(17)匹配(非)单词边界
元字符: \b \B
匹配规则 \b 匹配一个单词的边界
\B 匹配一个单词的非边界
数字字母下划线和其他字符的交界处认为是单词边界
data =re.findall('is','My name is liis') print(data) #输出['is', 'is'] data =re.findall('\bis\b','My name is liis') print(data) #输出[] data =re.findall('\\bis\\b','My name is liis') print(data) #输出['is'] data =re.findall(r'\bis\b','My name is liis') # r 表示原生字符串 匹配一个数字的"\\d"可以写成r"\d" print(data) #输出['is']
注意: \b的两种解释是: '\b', 如果前面不加r, 那么解释器认为是转义字符“退格键backspace”; r'\b', 如果前面加r, 那么解释器不会进行转义,\b 解释为正则表达式模式中的字符串边界。 而相比于\b, \w 只有第二种解释,并没有对应的转义字符,所以不加r, 也不会出错。
data =re.findall('a..x','a..x') print(data) #输出['a..x'] data =re.findall('a..x$','a..x$') print(data) #输出[] data =re.findall('a..x\$','a..x$') print(data) #输出 ['a..x$']
使用()为正则表达式分组
((ab)cd(ef)) : 表示给ab分了一个子组
obj = re.compile('abc') print(obj.findall('abcdefj')) data=re.findall('(ab)cd(ef)','abcdef') print(data) #输出[('ab', 'ef')] data=re.findall('(ab)cd(ef)','abdcef') print(data) #输出[] data=re.findall('((ab)cd(ef))','abcdef') print(data) #输出[('abcdef', 'ab', 'ef')] data=re.findall('(ab)dcef','abdcefyyyy') print(data) #输出['ab'] data=re.findall('(?:ab)dcef','abdcefyyyy') print(data) #['abdcef'] data=re.findall('(ab)dc(ef)','abdcefyyyy') print(data) #[('ab', 'ef')] data=re.findall('(?:ab)dc(ef)','abdcefyyyy') print(data) #['ef'] data=re.findall('(ab)dc(?:ef)','abdcefyyyy') print(data) #['ab'] data=re.findall('(?:ab)dc(?:ef)','abdcefyyyy') print(data) #['abdcef']
>>> re.findall(r"(abc)+", "abcabcabc") # 想要匹配多个"abc",使用分组时会优先把分组的内容返回 ['abc'] >>> re.findall(r"(?:abc)+", "abcabcabc") # 想要匹配多个"abc",(?:)把分组去掉,变成一个普通的字符串 ['abcabcabc']
data=re.findall(r'^(\d{3})-(\d{3,8})$', '010-12345') print(data) #输出的是 [('010', '12345')] data=re.match(r'^(\d{3})-(\d{3,8})$', '010-12345') print(data.group(0)) #group() 同 group(0) 就是匹配正则表达式整体结果 print(data.group()) #===group(0) print(data.group(1)) # 输出 010 print(data.group(2)) #输出 12345 print(data.groups()) #输出 ('010', '12345')
data=re.match('(?P<word>[a-z]+)', 'susu12sddd22sudd23').group() print(data) #输出 susu data=re.match('(?P<word>[a-z]+)\d+', 'susu12sddd22sudd23').group() print(data) #输出 susu12 data=re.match('(?P<word>[a-z]+)\d+', 'susu12sddd22sudd23').group('word') print(data) #输出 susu data=re.match('(?P<word>[a-z]+)(?P<age>\d+)', 'susu12sddd22sudd23').group() print(data) #输出 susu12 data=re.match('(?P<word>[a-z]+)(?P<age>\d+)', 'susu12sddd22sudd23').group('age') print(data) #输出 12 data=re.match('(?P<word>[a-z]+)(?P<age>\d+)', 'susu12sddd22sudd23').group('word') print(data) #输出 susu data=re.match('(?P<word>[a-z]+)(?P<age>\d+)', 'susu12sddd22sudd23').groups() print(data) #输出 ('susu', '12') data=re.match('(?P<word>[a-z]+)', 'susu12sddd22sudd23') print(data.groups()) #输出('susu',)
group() 同 group(0) 就是匹配正则表达式整体结果 group(1) 列出第一个括号匹配部分,group(2) 列出第二个括号匹配部分,group(3) 列出第三个括号匹配部分。 group(num=0) 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。 groups() 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。
二、re模块
compile(pattern, flags=0)
compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象
obj = re.compile('abc') print(obj.findall('abcdefj'))
findall(string,pos ,endpos)
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
data =re.findall('myabc','myabc hahhhh myabc') print(data) #输出['myabc', 'myabc'] obj = re.compile('abc') print(obj.findall('abcdefj',pos= 0,endpos=7)) #['abc'] obj = re.compile('abc') print(obj.findall('abcdefj',pos= 1,endpos=7)) #输出[]
split 方法按照能够匹配的子串将字符串分割后返回列表
data = re.split('\s+','hello python') print(data) #输出['hello', 'python']
sub(pattern,re_string,string,count)
功能:用目标字符串替换正则表达式匹配内容
参数:re_string 用什么来替换
string 要匹配的目标字符串
count 最多替换几处
返回值 : 返回替换后的字符串
subn()
返回值 : 比sub多一个实际替换的个数
data = re.sub('\d+','++','susu20sugh19myd30yunxi2') print(data) #输出 susu++sugh++myd++yunxi++ data = re.subn('\d+','++','susu20sugh19myd30yunxi2') print(data) #输出 ('susu++sugh++myd++yunxi++', 4)
match():尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
import re print(re.match('www','www.siit.com').span()) #起始位置匹配 print(re.match('com','www.siit.com')) #不在起始位置 """ 执行结果 (0, 3) None """
re.search 扫描整个字符串并返回第一个成功的匹配。
import re print(re.search('www','www.siit.com').span()) #起始位置匹配 print(re.search('com','www.siit.com').span()) #不在起始位置 """ 执行结果 (0, 3) (9, 12) """