re模块(正则表达式)
1、普通字符:大多数字符和字母都会和自身匹配
import re # 前一段字符串为匹配规则,后一段字符串为要匹配的字符串 ret = re.findall(‘adc‘,‘youareagoodadcpreson‘) print(ret)# [‘adc‘]
2、元字符:. ^ $ * + ? {} [] \ () |
2-1 . ^ $ * + ? {}
import re # . 代表一个字符除了‘\n‘ ret1 = re.findall(‘a..d‘, ‘helloabcdefg‘) ret2 = re.findall(‘a..d‘, ‘helloabdefg‘) print(ret1,ret2)# ret1匹配成功[‘abcd‘],ret2匹配失败[] # ^ 代指字符串的开头 ret1 = re.findall(‘^a..d‘, ‘abcdef‘) ret2 = re.findall(‘^a..d‘, ‘qabcdef‘) print(ret1, ret2)# ret1匹配成功[‘abcd‘],ret2匹配失败[] # $ 代指字符串的结尾 ret1 = re.findall(‘a..d$‘, ‘qwerabcd‘) ret2 = re.findall(‘a..d$‘, ‘qwerabcdef‘) print(ret1, ret2)# ret1匹配成功[‘abcd‘],ret2匹配失败[] # * 紧挨的字符重复0--无穷次 ret1 = re.findall(‘ra*‘, ‘qweraaaaabcd‘) ret2 = re.findall(‘qwel*‘, ‘qweraaaaabcd‘) print(ret1, ret2)# [‘raaaaa‘] [‘qwe‘] # + 紧挨的字符重复1--无穷次 ret1 = re.findall(‘qwera+‘, ‘qweraaaaabcd‘) ret2 = re.findall(‘qwerb+‘, ‘qwerabcdef‘) print(ret1, ret2)# [‘qweraaaaa‘] [] # ?代表紧挨的字符匹配0--1次 ret1 = re.findall(‘qwera?‘, ‘qweraaaaabcd‘) ret2 = re.findall(‘qwerb?‘, ‘qwerabcdef‘) print(ret1, ret2)#[‘qwera‘] [‘qwer‘] ### 注意:前面的 + * ? 等都是贪婪匹配,也就是尽可能的匹配,后面加 ? 使其变为惰性匹配 ret = re.findall(‘qwera+?‘, ‘qweraaaaabcd‘) print(ret)# [‘qwera‘] # {0, } == * # {1, } == + # {0, 1} == ? ret1 = re.findall(‘qwera{0,2}‘, ‘qweraaaaabcd‘) ret2 = re.findall(‘qwera{0,}‘, ‘qweraaaaabcd‘) print(ret1, ret2)# [‘qweraa‘] [‘qweraaaaa‘]
2-2 字符集 []
import re ret1 = re.findall(‘a[bc]d‘, ‘qwacd‘) ret2 = re.findall(‘a[bc]d‘, ‘qwabcd‘) ret3 = re.findall(‘a[bc]‘, ‘qwa‘) ret4 = re.findall(‘a[bc]*‘, ‘qwa‘) print(ret1, ret2, ret3, ret4)# [‘acd‘] [] [] [‘a‘] ret1 = re.findall(‘a[a-z]d‘, ‘qwacd‘) ret2 = re.findall(‘[a-z]‘, ‘abcd‘) print(ret1, ret2)# [‘acd‘] [‘a‘, ‘b‘, ‘c‘, ‘d‘] ret = re.findall(‘a[.*+]‘, ‘qwa.a*ca+d‘) print(ret)# [‘a.‘, ‘a*‘, ‘a+‘] ### 字符集中有功能的符号: - ^ ret = re.findall(‘[1-9]‘, ‘1ab3cd6f‘) # 按ASCII码排列 print(ret)# [‘1‘, ‘3‘, ‘6‘] #在字符集中^代表非 ret1 = re.findall(‘[^1-9]‘, ‘123abc‘) ret2 = re.findall(‘[^abc]‘, ‘123abc‘) print(ret1, ret2)# [‘a‘, ‘b‘, ‘c‘] [‘1‘, ‘2‘, ‘3‘] ret = re.findall(‘[\d]‘, ‘qwe231‘) print(ret)# [‘2‘, ‘3‘, ‘1‘]
2-3 转义字符 \
反斜杠后面跟元字符去除特殊功能,比如*
反斜杠后面跟普通字符实现特殊功能,比如\d
\d---匹配任何十进制数,相当于类[0-9]
\D---匹配任何非数字字符,相当于类[^0-9]
\s---匹配任何空白字符,相当于类[\t\n\r\f\v]
\S---匹配任何非空白字符,相当于类[^\t\n\r\f\v]
\w---匹配任何字母数字字符,相当于类[a-zA-Z0-9]
\W---匹配任何非字母数字字符,相当于类[^a-zA-Z0-9]
\b---匹配一个特殊字符边界,比如空格,&,#等
import re a = ‘i am good boy‘ ret = re.findall(‘i\\b‘, a)# 模式字符串 print(ret)# [] ret = re.findall(r‘i\b‘, a)# 原生字符串 print(ret)# [‘i‘] ret = re.findall(r‘i\\l‘, ‘i\lm‘) print(ret)# [‘i\\l‘]
由于模式字符串中可能包含大量的特殊字符和反斜杠,所以需要写为原生字符串,即在模式字符串前加 r 或 R.
2-4 分组 ()
import re ret1 = re.findall(r‘(ab)+‘, ‘123abbb‘) print(ret1)# [‘ab‘] ret2 = re.findall(‘abc+‘, ‘123abc3abcabc‘) print(ret2)# [‘abc‘, ‘abc‘, ‘abc‘] # 以abc为整体,返回值为abc ret3 = re.findall(‘(abc)+‘, ‘123abcabcabc‘) print(ret3)# [‘abc‘] # 优先返回分组里的内容 ret4 = re.findall(‘a(b|c)d‘, ‘1abd2acd3‘) print(ret4)# [‘b‘, ‘c‘] # 在 () 中加 ?: 取消权限 ret5 = re.findall(‘a(?:b|c)d‘, ‘1abd2acd3‘) print(ret5)# [‘abd‘, ‘acd‘]
2-5 选择字符 |
| 表示或
import re ret1 = re.findall(‘abc|d‘, ‘123abd‘) print(ret1)# [‘d‘] ret2 = re.findall(‘abc|d‘, ‘123abc|d‘) print(ret2)# [‘abc‘, ‘d‘] ret3 = re.findall(‘ab(c|d)‘, ‘abc123abd‘) print(ret3)# [‘c‘, ‘d‘]
3、标志位
A or ASCII--->对于\w,\W,\b,\B,\d,\D,\s,\S只进行ASCII匹配
I or IGNORECASE--->执行不区分字母大小写的匹配
M or MULTILINE--->将^和$用于包括整个字符串的开始和结尾的每一行
S or DOTALL--->使用(.)字符匹配所有字符,包括换行符
X or VERBISE--->忽略模式字符串中为转移的空格和注释
4、re模块下的常用方法
4-1 re.findall(pattern, string, [flags])
pattern--模式字符串,rep--替换的字符串, string--被查找替换的原始字符串
(可选参数)flags--表示标志位,控制匹配方式
import re # 满足所有匹配条件的结果,放在列表里 ret1 = re.findall(‘ab‘, ‘abcabc‘) print(ret1)# [‘ab‘, ‘ab‘]
4-2 re.search(pattern, string, [flags])
import re # 整个字符串中搜索第一个匹配的值,匹配成功则返回Match对象,否则返回None ret2 = re.search(‘ab‘, ‘123abcabc‘) print(ret2)# <re.Match object; span=(3, 5), match=‘ab‘> ret3 = re.search(‘ab‘, ‘123abcabc‘).group() print(ret3)# ab # 匹配括号中的值赋予一个变量名()-->(?P<变量名>模式字符串) ret3 = re.search(R‘(?P<name>[a-z]+)\d+‘, ‘abc123abc123abc‘).group() print(ret3)# abc123 ret4 = re.search(R‘(?P<name>[a-z]+)\d+‘, ‘abc123abc123abc‘).group(‘name‘) print(ret4)# abc
4-3 re.match(pattern, string, [flags])
同Search,但是仅在字符串开始处进行配对
import re ret1 = re.match(‘1a‘, ‘1a2b3c‘) print(ret1)# <re.Match object; span=(0, 2), match=‘1a‘> ret2 = re.match(‘2b‘, ‘1a2b3c‘) print(ret2)# None
4-4 re.split(pattern, string, [maxsplit], [flags])
(可选参数)maxsplit--最大的拆分次数
import re ret1 = re.split(‘ ‘, ‘hello world !‘) print(ret1)#[‘hello‘, ‘world‘, ‘!‘] # 分割字符左边无字符时为空 ret2 = re.split(‘[ |]‘, " hello every|world !") print(ret2)#[‘‘, ‘hello‘, ‘every‘, ‘world‘, ‘!‘]
4-5 re.sub(pattern, rep1, string, [count], [flags])替换字符串
rep--替换的字符串
(可选参数)count--替换的最大次数,默认为0
import re ret1 = re.sub(‘\d‘, ‘A‘, ‘123abc‘, 0) print(ret1)# AAAabc ret2 = re.sub(‘\d+‘, ‘A‘, ‘12ab34cd‘, 1) print(ret2)# Aab34cd # 元组形式,包含匹配次数 ret3 = re.subn(‘\d+‘, ‘A‘, ‘1a2b3c4d‘) print(ret3)# (‘AaAbAcAd‘, 4)
4-6 将模式字符串转换为正则表达式对象
import re bj = re.compile(‘\d+‘) ret = obj.findall(‘1a2b3c4d‘)# 好处:可以多次使用 print(ret)# [‘1‘, ‘2‘, ‘3‘, ‘4‘]
4-7 re.findall() 与 re.finditer()
import re # 所有结果封装到列表 ret1 = re.findall(‘\d‘, ‘1a2b3c‘) print(ret1)# [‘1‘, ‘2‘, ‘3‘] # 返回迭代器对象 ret2 = re.finditer(‘\d‘, ‘1a2b3c‘) print(ret2)# <callable_iterator object at 0x000001EC44F2CAC8> print(next(ret2).group())# 1 print(next(ret2).group())# 2