re模块

来源:互联网 发布:抹茶美妆软件 编辑:程序博客网 时间:2024/05/02 00:47

re模块

正则表达式
匹配字符串内容的一种规则(官方定义:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。)

字符组[]
一个字符组只能匹配一个字符,如果需要一个字符组匹配多个字符,可以加上量词。
数字字符组
[0123456789] == [0-9]
[1-5]
可以枚举全部的内容, 也可以简写内容,简写模式必须从小到大。
字母字符组(按ascii码匹配)
[a-z] or [A-Z]
数字字母混合型
[0-9a-fA-F] 可以验证十六进制

元字符
这里写图片描述

量词
这里写图片描述

贪婪匹配和非贪婪匹配
正则默认是贪婪匹配, 在量词后面加上?,就可以变成非贪婪匹配
.*?x 取前面任意长度的字符,直到一个x出现 # !!
拿正则表达式匹配文本
实例: 匹配身份证号: ^[1-9]\d{14}(\d{2}[0-9x])?$ | (\d{2}[0-9x])?$以这个整体为结尾

re模块
re.findall(pattern, string)
返回所有满足正则条件匹配结果的列表,没有匹配项返回空列表。

import reret = re.findall('f', 'hehe hello hehaha')print(ret)

re.search(pattern, string) 扫描字符串查找正则表达式模式产生匹配的第一个位置,并返回相应的match object。返回满足匹配条件的match object,需用.group()方法显示值, 没有找到会返回None,此时再调用.group()方法会报错,所以最好判断下。

ret = re.search('he', 'hehe,hello,hehaha')if ret:    print(ret.group())ret = re.search('he', 'hehe,hello,hehaha').group()print(ret)ret = re.search('haa', 'hehe,hello,hehaha').group()print(ret)

re.match(pattern, string) 如果字符串开头的零个或多个字符与正则表达式模式相匹配,则返回相应的match object。返回满足匹配条件的match object,用.group()方法显示,开头不满足匹配条件,返回None。

ret = re.match('he', 'hehe, hello, haha')print(ret.group())ret = re.match('he', 'hahe, hello, haha')print(ret)

re.split(pattern, string, max)
按正则分割字符串,可设置分割次数,返回分割后的列表。

ret = re.split('[he]', 'hellohehahehi')print(ret)  # 注意切割顺序,先用h去切,然后再用e去切

re.sub(pattern, repl, string, count) 用repl替换string中符合正则条件的元素,返回修改后的字符串。

ret = re.sub('\s', '*', 'hello mui hello python')print(ret)ret = re.sub('\s', '*', 'hello mui hello python', 2)print(ret)

re.subn(pattern, repl, string, count)
返回一个元组:(new_string, number)

ret = re.subn('\s', ',', 'hello world and python')print(ret)

re.compile() 编译正则表达式,方便随时调用
可以将正则表达式编译成一个正则表达式对象,匹配时可以调用它的match()和search()方法。

obj = re.compile('\d{3}')ret = obj.search('abc123ddd')if ret:    print(ret.group())ret = obj.findall('ssdsdsf31212131dsdd')print(ret)

re.finditer(pattern, string) 返回符合匹配的迭代器。

ret = re.finditer('\S', 'asfsdfa1231 sd')print(ret)print([i.group()for i in ret]) 找不到返回空列表

补充:

ret = re.match('(13|14|15|16|18)[0-9]{9}$', '1334950488334444444')print(ret.group())

1 、特殊的符号转译。匹配的内容如果有\ . + () 之类的特殊符合
需要进行转译,即前面加上\(与正则表到式符号冲突
2 、findall 优先级,如果正则里有组的话,会优先把符合组内的正则
规则找出来的内容组成列表返回,其他的即使符合规则,也不显示, 如果要找全部的内容
可以在组内加?:取消权限。(?:)

ret = re.findall('www.(?:baidu|163|taobao|google).com', 'www.baidu.com')print(ret)

3、split会按正则切割字符转,符合正则内容的项目不会保留
但是如果正则是写在()内,则会把符合正则内容的项目也保留下来

ret = re.split('\d+', 'sdsd1sdsd3sdsd4sdsd5')print(ret)ret = re.split('(\d+)', 'sdsd1sdsd3sdsd4sdsd5')print(ret)

4,
.*?的用法
匹配标签, 在分组里用?P<name>的形式给分组起名字
可以用.group(‘名字’)的形式直接获取对应的值。

ret = re.search("<(?P<tag_name>\w+)>\w+</(?P=tag_name)>", "<h1>hello</h1>")print(ret.group('tag_name'))print(ret.group())

如果不给组起名字,也可以用\序号来找到对应的组,表示要找的内容和前面的组内容一致,获取的匹配结果可以直接用group(序号)拿到对应的值。

ret = re.search(r"<(\w+)>\w+</\1>","<h1>hello</h1>")print(ret.group(1))print(ret.group())  #结果 :<h1>hello</h1>
原创粉丝点击