正则表达式学习

    科技2024-05-09  81

    第一个程序

    import re key=r"<h1>hello world <h1>" p1=r"<h1>.+<h1>" pattern=re.compile(p1) print(pattern.findall(key)) ['<h1>hello world <h1>'] key=r"aaa@qq.com" p="aaa@qq.com" pattern=re.compile(p) print(pattern.findall(key)) ['aaa@qq.com']

    “.” 代表可以匹配任意字符

    key=r"aaa@qq.com" p="aaa@qq.com" pattern=re.compile(p) print(pattern.findall(key)) ['aaa@qq.com'] #将原来的要匹配的字符串中的"."换成其他符号试试 key=r"aaa@qq)com" p="aaa@qq.com" pattern=re.compile(p) print(pattern.findall(key)) ['aaa@qq)com']

    使用“+”表示可以匹配多个字符

    key=r"aaa@qq)))))com" p="aaa@qq.+com" pattern=re.compile(p) print(pattern.findall(key)) ['aaa@qq)))))com']

    使用“*”表示可以匹配0个或者更多的字符

    key=r"http://www.baidu.com & https://www.hao123.com" p="https*://" pattern=re.compile(p) print(pattern.findall(key)) #在这里使用了“*”就可以匹配任意个“p” ['http://', 'https://']

    解决大小写问题 “[]” 方括号是解决其中任意一个 “+”1次或者多次 “*”0次或者多次

    key=r"hahah<hTml>aoisjgoajogj<Html>jalfjla" p=r"<[hH][tT][mM][lL].+[hH][tT][mM][lL]>" pattern=re.compile(p) print(pattern.findall(key)) ['<hTml>aoisjgoajogj<Html>']

    使用"[^字符]"去掉不需要的字符

    # 筛选出不含有 x 作为开头的单词 key=r"lap map nap rap xap aap ap" p=r"[^x]ap" pattern=re.compile(p) print(pattern.findall(key))

    简洁正则表达式常用写法

    [0-9] 0到9任意之一

    [a-z]小写字母任意之一

    [A-Z]大写字母任意之一

    \d 等同于[0-9]

    \D 等同于[^0-9]匹配非数字

    \w 等同于[a-z0-9A-z]匹配大小写字母、数字和下划线

    \W 等同于[^a-z0-9A-z]等同于上一条取非

    使用“?”和{} 设定匹配次数 懒惰与贪婪

    # 不加? key=r"heiheihei@imooc.com.cn.aa" p=r"@.+\." pattern=re.compile(p) print(pattern.findall(key)) ['@imooc.com.cn.'] # 加上? 匹配到一次就停止 key=r"heiheihei@imooc.com.cn.aa" p=r"@.+?\." pattern=re.compile(p) print(pattern.findall(key)) ['@imooc.'] # 寻找 a 重复一次到两次的字符串 key=r"bt&bat&baat&baaat" p=r"ba{1,2}t" pattern=re.compile(p) print(pattern.findall(key)) ['bat', 'baat'] # 寻找 a 最多两次的字符串 key=r"bt&bat&baat&baaat" p=r"ba{,2}t" pattern=re.compile(p) print(pattern.findall(key)) ['bt', 'bat', 'baat'] # 寻找 a 两次及以上的字符串 key=r"bt&bat&baat&baaat" p=r"ba{2,}t" pattern=re.compile(p) print(pattern.findall(key)) ['baat', 'baaat']

    元字符

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-koMRvNxY-1602050660584)(attachment:image.png)]

    小例子 寻找MAC服务器地址 子表达式的相关概念

    key=r"bt124.2.3.4baaat" p=r"\d+?\.\d+?\.\d+?\.\d+?\." pattern=re.compile(p) print(pattern.findall(key)) ['124.2.3.4.'] #改进 限定这个要匹配的数字的个数 1个到3个 key=r"bt124.2.3.4.5baaat" p=r"\d{1,3}?\.\d{1,3}?\.\d{1,3}?\.\d{1,3}" pattern=re.compile(p) print(pattern.findall(key)) ['124.2.3.4']

    将前面的一个表达式用“()”起来变成一个子表达式

    #改进 将前面的子表达式()起来视作一个子表达式 key=r"bt124.2.0.4.5baaat" p=r"(\d{1,3}?\.){3}\d{1,3}" pattern=re.compile(p) print(pattern.findall(key)) ['0.'] #上面的方法不能用 该变方法使用match match=pattern.search(key) print(match.group(0)) 124.2.0.4

    使用“?:” 将匹配模式设置成为非捕获组

    key=r"bt124.2.0.4.5baaat" p=r"(?:\d{1,3}?\.){3}\d{1,3}" pattern=re.compile(p) print(pattern.findall(key)) ['124.2.0.4']

    删除操作 前瞻与后顾

    前瞻: exp1(?=exp2)   查找exp2前面的exp1

    后顾:(?<=exp2)expe1  查找exp2后面的exp2

    负前瞻: exp1(?!exp2)  查找后面不是exp2的exp1

    负后顾:(?<exp2)exp1  查找前面不是exp2的exp1

    import re key=r"<h1>hello world <h1>" p1=r"(?<=<h1>).+(?=<h1>)" pattern=re.compile(p1) print(pattern.findall(key)) ['hello world '] import re key=r"<h1>hello world </h1><h2>hello world </h2><h3>hello error </h3><h1>helll </h2>" p1=r"(?<=(h[1-6])>)[^<>]+?(?=</\1>)" #[^<>] 设置成为非字符 pattern=re.compile(p1) #返回一个迭代器 objs=pattern.finditer(key) list=[] for obj in objs: list.append(obj.group()) print(list) ['hello world ', 'hello world ', 'hello error ']

    实战第一弹:正则校验篇

    校验email地址

    #邮箱的规则是 #数字、字母、下划线 +@ +数字、英文(小写)+.+英文(长度一般是2—4) key=r'asda@asdfa.com' # ^ 代表开始 $表示结束 pa=r"^\w+@[a-z0-9]+\.[a-z]{2,4}$" pattern1=re.compile(pa) print(pattern1.findall(key)) ['asda@asdfa.com']

    校验手机号

    #手机号的规则 #11位数,都是数字。开头一定是1 key_phone_num=r"17289899995" p1=r"^1\d{10}$" pattern=re.compile(p1) print(pattern.findall(key_phone_num)) ['17289899995']

    校验身份证号

    ##身份证号15位/18位,最后一位有校验码 #18位:6位地区码+8位出生年月+3位顺序码+1位校验码 #15位:6位地区码+6位出生年月+2位顺序码+1位校验码 #规则1:除了校验码全部为数字 #规则2:首位地区码不是0 #规则3:中间出生年月位日期 #规则4:校验码可以是数字和字母X key=r"42130219550522081X" p1=r"^[0-9]\d{5}(18|19|(2\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9xX]$" pattern1=re.compile(p1) #print(pattern1.finditer(key)) list=[] for obj in objs: list.append(obj) print(list) []

    实战第二弹:正则表达式实现24点

    24点是一款益智游戏,是把4个整数通过加、减、乘、除以及括号运算,是最后的计算结果是24的一个数学游戏。

    我们的目标是程序自动判断给出的四个整数,并列出可以得出24点的计算公式。

    #算子 operator=['+','-','*','/'] # 算子数字和括号的组合 format=['%d%s%d%s%d%s%d',]
    Processed: 0.014, SQL: 8