python-re模块
re模块
正则表达式就是字符串的的匹配规则。
常用的规则
# 匹配规则 # '.' 默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行 # '^' 匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE) # '$' 匹配字符结尾, 若指定flags MULTILINE ,re.search('foo.$','foo1\nfoo2\n',re.MULTILINE).group() 会匹配到foo1 # '*' 匹配*号前的字符0次或多次, re.search('a*','aaaabac') 结果'aaaa' # '+' 匹配前一个字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 结果['ab', 'abb'] # '?' 匹配前一个字符1次或0次 ,re.search('b?','alex').group() 匹配b 0次 # '{m}' 匹配前一个字符m次 ,re.search('b{3}','alexbbbs').group() 匹配到'bbb' # '{n,m}' 匹配前一个字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 结果'abb', 'ab', 'abb'] # '|' 匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 结果'ABC' # '(...)' 分组匹配, re.search("(abc){2}a(123|45)", "abcabca456c").group() 结果为'abcabca45' # # # '\A' 只从字符开头匹配,re.search("\Aabc","alexabc") 是匹配不到的,相当于re.match('abc',"alexabc") 或^ # '\Z' 匹配字符结尾,同$ # '\d' 匹配数字0-9 # '\D' 匹配非数字 # '\w' 匹配[A-Za-z0-9] # '\W' 匹配非[A-Za-z0-9] # '\s' 匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 结果 '\t' # # '(?P<name>...)' 分组匹配 re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})","371481199306143242").groupdict("city") # 结果{'province': '3714', 'city': '81', 'birthday': '1993'}
匹配规则操作:
# 6.匹配规则的操作 # '.'操作 print('.:', re.match('.', '12abc')) # 1个任意字符 print('.:', re.match('..', '12abc')) # 2个任意字符 # '^' print('^:', re.search('^a', 'abc')) # a开头 print('^:', re.search('^ab', 'abc')) # ab开头 # '$' print('$:', re.search('b$', '12abb')) # 匹配以b结尾 # '*' print('*:', re.search('a*', 'ABC')) # 匹配a字符的0次或多次 print('*:', re.search('a*', 'aaaab3')) # 匹配a字符的0次或多次 print('*:', re.search('ab*', 'aaab')) # 匹配ab字符的0次或多次 # '+' print('+:', re.search('ab+', 'ABC')) # 匹配b字符的0次或多次 print('+:', re.search('ab+', 'aaaabbbbb')) # 匹配ab字符的0次或多次 print('+:', re.search('ab+', 'aaabaaaa')) # 匹配ab字符的0次或多次 # '?' print('?:', re.search('ab?', 'ABC')) # 匹配b字符的0次或1次 print('?:', re.search('ab?', 'aaaabbbbb')) # 匹配ab字符的0次或1次 # {m} print('m:', re.search('a{2}', 'ABC')) # 匹配a字符的2次 print('m:', re.search('a{2}', 'aaaabbbbb')) # 匹配a字符的2次 print('m:', re.search('a{2}', 'addaadbb')) # 匹配a字符的2次 print('m:', re.search('.{2}', 'addaadbb')) # 匹配任意字符2次 print('m:', re.search('[0-9]{2}', 'addaad23bb')) # 匹配任意数字2次 # {n,m} # [0-9][a-z] print('n-m:', re.search('[a-z]{1,2}', 'a2blex')) # 匹配[a-z]字符的1~10次 # | or关系 print('|', re.search('[a|A]lex', 'alex')) print('|', re.search('[a|A]lex', 'Alex')) # 分组匹配 print('分组:', re.search('([a-z]+)([0-9]+)', 'abc123').groups())
分组匹配:
# 分组匹配 '(?P<name>...)' s = '1307042000005250613' res = re.search('(?P<province>\d{3})(?P<city>\d{3})(?P<born_year>\d{4})', s).groups() res2 = re.search('(?P<province>\d{3})(?P<city>\d{3})(?P<born_year>\d{4})', s) print(res) # 输出组 print(res2.groupdict()) # 生成字典
匹配语法:
# 匹配语法: # re.match 从头开始匹配 # re.search 匹配包含 # re.findall 把所有匹配到的字符放到以列表中的元素返回 # re.split 以匹配到的字符当做列表分隔符 # re.sub 匹配字符并替换 # re.fullmatch 全部匹配
re.match(pattern,string,flags=0)
# 1.match 操作 re.match(pattern, string, flags=0) # 下面返回None s = 'abc1d3e' print(re.match('[0-9]', s)) # 从头开始匹配 # 判断第一行第一个值必须是数字。 # 匹配到1,返回 s2 = '1a1b' print(re.match('[0-9]', s2))
re.search(pattern,string,flags=0)
# 2.search 操作 re.search(pattern, string, flags=0) # 开头不是数字,从字符串中搜索,匹配到1 s3 = 'abc1d3e' print(re.search('[0-9]', s3)) # 搜索字符串,找到1个就返回
re.search 进行分组操作
操作注意:
为了避免匹配报错,可以先拿到匹配结果再进行分组操作
# 4.通过search 匹配并拿到匹配后的结果
s5 = 'abc1d3e'
res = re.search('[0-9]', s5) # 把结果存到res变量
if res:
print('serach_res:', res.group()) # 进行分组操作
re.findall(pattern,string,flags=0)
# 3.findall 操作 # 如果想找到所有的数字,返回列表 s4 = 'abc1d3e' print(re.findall('[0-9]', s4)) # 搜索字符串,找到所有符合要求的值
re.split(pattern,string,maxsplit=0,flags=0)
# re.split 划分 s = 'alex22jack23rain32jinxin50' print(re.split('\d+', s)) # 过滤所有的名字 print(re.findall('\d+', s)) # 过滤所有的年龄 s3 = '1-2*4/45+2' print(re.split('[-+*/]',s3)) print(re.split('[-+*/]',s3,maxsplit=2))
re.sub(pattern,repl,string,count=0,flags=0)
# re.sub print(re.sub('\d+', '_', s)) # 匹配并替换内容 print('re.sub', re.sub('\d+', '|', 'alex22wupeiqi33oldboy55',count=2))
re.fumatch(pattern,repl,string,count=0,flags=0)
# re.fullmatch # 整个字符串匹配成功就返回er对象,否则返回None print(re.fullmatch('abc', 'abc')) # re.fullmatch 匹配邮箱 print(re.fullmatch('\w+\.\w+\.com', 'www.baidu.com'))
re.compile(pattern,flags=0)
# re.compile # 用法 # 1.先把规则写好返回一个规则表达式对象 pattern = re.compile('\w+@\w+\.(com|cn|edu)') # 先定义好匹配规则 # 2.调用时直接可以使用 print(pattern.fullmatch('abc@oldouyedu.com'))
Flags操作:
# Flags标识符 # 1.re.I 忽略大小写 print(re.search('a','abc')) #匹配到'a' print(re.search('a','ABC')) #匹配不到'a' print(re.search('a','ABC',re.I)) #匹配到'A' # 2.多行模式 re.MULTILINE print(re.search('foo.$', 'foo1\nfoo2\n')) # 匹配到foo2 print(re.search('foo.$', 'foo1\nfoo2\n', re.MULTILINE)) # 匹配到foo2 # 3.re.S print(re.search('.', '\n')) print(re.search('.', '\n', re.S)) # 4.re.VERBOSE # 可以让匹配规则换行,便于添加注释 a = re.compile(r"""\d+ # 匹配数字部分 \. # 匹配'.'字符 \d* """, # 匹配数字部分 re.X) # 普通写法 b = re.compile(r"\d+\.\d*") print(a.search('12.34')) print(b.search('12.34'))