一、结合match匹配任意字符串
(一)匹配单个字符串
字符 功能 . 匹配任意1个字符(除了\n) [ ] 匹配[ ]中列举的字符 \d 匹配数字,即0-9 \D 匹配非数字,即不是数字 \s 匹配空白,即 空格,tab键 \S 匹配非空白 \w 匹配单词字符,即a-z、A-Z、0-9、_ \W 匹配非单词字符
(二)匹配多个字符串
字符 功能 * 匹配前一个字符出现0次或者无限次,即可有可无 + 匹配前一个字符出现1次或者无限次,即至少有1次 ? 匹配前一个字符出现1次或者0次,即要么有1次,要么没有 {m} 匹配前一个字符出现m次 {m,n} 匹配前一个字符出现从m到n次
(三)匹配开头和结尾
(四)匹配一手机号 (不是以4、7结尾的手机号码(11位))
import re
tel_num = '13411331125'
re_obj = re.compile(r"1[34578][0-9]{8}[0-35-68-9]$" )
match_tel_num = re_obj.match(tel_num)
print match_tel_num.group()
(五)匹配一个邮箱 (匹配出163的邮箱地址,且@符号之前有4到20位,例如hello@163.com)
import re
email = "hello@163.com"
# 1、邮箱地址以大小写字母,数字,下划杠组成
# 2、而\w里面还包括汉子,所以不能用。
# 3、{m,n}之间,后面不能有空格
# 4、邮箱地址的.得用\转义,否则按任意字符算
# 5、如果在.com后面不跟上$那么com后还有字符串得情况也同样匹配
match_email = re.match("[a-zA-Z0-9_]{4,20}@163\.com$" , email)
print(match_email.group())
(六)匹配0-100之间的数字
import re
num = input("请输入一个0-100之间的数字:" )
# 1、0-100首先十位输为1-9
# 2、10-99个位上得数为0-9
# 3、因为有一位数和两位数,所以十位数可以判定位可取可不取得
# 4、被匹配得对象必须为字符串类型
# 5、如果大部分条件满足,只有一部分不满足,那么可以用 |
# 6、一般情况下不要随便加空格,也算一个字符
match_num = re.match("[1-9]?[0-9]$|100" , num)
if match_num:
print("%s是0-100之间得数字。" % match_num.group())
else :
print("%s不是0-100之间得数字。" % num)
二、匹配分组的用法
(一)匹配分组
字符 功能 | 匹配左右任意一个表达式 (ab) 将括号中字符作为一个分组 \num 引用分组num匹配到的字符串 (?P) 分组起别名 (?P=name) 引用别名为name分组匹配到的字符串
(二)匹配163,126,qq邮箱
import re
email_list = ["32423423@163 .com" , "a124223434.com" , "sfdsfw@126 .com" , "47611@qq .com" ]
for email in email_list:
match_email = re.match("[0-9a-zA-Z_]{4,20}@( 163|126|qq)\.com" , email)
if match_email:
print ("%s 符合邮箱格式,他是一个%s 邮箱。" % (match_email.group(), match_email.group(1 )))
else :
print ("%s 不符合邮箱格式。" % email)
(三)提取区号和电话号码
import re
phone_num = "0351-5600123"
# 1、要想提取,那么先用正则匹配,然后分组
# 2、以后遇到提取数据一般用正则分组
# 3、区号是以0开始的,并且可以出现三位或者四位
# 4、凡事以后不确定位数的都用?
# 5、电话号码开头不能为0,一般为7位或者8位用{m,n}
match_p_num= re.match("(0\d{2}\d?)-([1-9]\d{6,7}$)" , phone_num)
print(match_p_num)
print("提取的区号是:%s" % match_p_num.group(1 ))
(四)分组的高级用法1
import re
ret = "<html>hh</html>"
match_ret = re.match(r"<([a-zA-Z]+)>\w*</\1>" , ret)
print(match_ret.group())
(五)分组的高级用法2
import re
ret = "<html><h1>www.itcast.cn</h1></html>"
match_ret = re.match(r"<([a-zA-Z]+)><([a-zA-Z0-9]+)>([w]{3}\.\w+\.cn)</\2></\1>" , ret)
print(match_ret.group())
print(match_ret.group(3 ))
match_ret1 = re.match(r"<(?P<a1>[a-zA-Z]+)><(?P<a2>[a-zA-Z0-9]+)>([w]{3}\.\w+\.cn)"
r"</(?P=a2)></(?P=a1)>" , ret)
print(match_ret1.group())
三、re模块的高级用法
(一)search的用法 ( 匹配出文章阅读的次数)
import re
ret = "文章的阅读次数位:9999"
# 1、如果想匹配文章的次数,用match就不可以了
# 2、因为match是从字符串开头开始匹配。
# 3、而我先现在需要搜寻任意地方符合正则的字符串
# 4、提炼出次数,全是数字就ok
search_ret = re.search("\d+" , ret)
print(search_ret.group())
(二)findall的用法 (统计出python、c、c++相应文章阅读的次数)
import re
ret = "python = 9999, c = 7890, c++ = 12345"
findall_ret = re.findall(r"\d+" , ret)
print(findall_ret)
(三)sub的用法
import re
content = """
<div >
<p > 岗位职责:</p >
<p > 完成推荐算法、数据统计、接口、后台等服务器端相关工作</p >
<p > <br > </p >
<p > 必备要求:</p >
<p > 良好的自我驱动力和职业素养,工作积极主动、结果导向</p >
<p > <br > </p >
<p > 技术要求:</p >
<p > 1、一年以上 Python 开发经验,掌握面向对象分析和设计,了解设计模式</p >
<p > 2、掌握HTTP协议,熟悉MVC、MVVM等概念以及相关WEB开发框架</p >
<p > 3、掌握关系数据库开发设计,掌握 SQL,熟练使用 MySQL/PostgreSQL 中的一种<br > </p >
<p > 4、掌握NoSQL、MQ,熟练使用对应技术解决方案</p >
<p > 5、熟悉 Javascript/CSS/HTML5,JQuery、React、Vue.js</p >
<p > <br > </p >
<p > 加分项:</p >
<p > 大数据,数理统计,机器学习,sklearn,高性能,大并发。</p >
</div >
"""
# 1、第一个参数是正则
# 2、第二个参数是符合正则的替换的字符串
# 3、第三个参数是文本内容
# 4、只要把所有的尖括号替换成""就ok了
# 5、如果我们不用?那么相当于开启贪婪模式,那么从第一个尖括号开始,知道遇到最后一个尖括号才结束,里面的内容都被替换
# 6、所以我们必须用?关闭贪婪模式。
# 7、用strip处理所有的空格。
sub_content = re.sub(r"<.+? > ", "", content)
print(sub_content.strip())
(四)split的用法 (切割字符串“info:xiaoZhang 33 shandong”)
import re
ret = "info:xiaoZhang 33 shandong"
# 1、如果字符串中出现了多种富豪,那么不能用普通的字符串切割,会很麻烦,应该用正则切割
# 2、切割后返回一个列表
# 3、第一个参数是正则需要处理的富豪
# 4、注意如果出现空格,则必须打出来。否则效果不一样
split_ret = re.compile(":| " )
split_data = split_ret.split( ret)
print(split_data)
(五)贪婪模式和非贪婪模式
import re
s = "This is a number 234-235-22-423"
# 1、贪婪模式一般针对于match和sub使用
# 2、如果在在"*","?","+","{m,n}"后面加上?,使贪婪变成非贪婪。
match_s = re.match("(.*)(\d+-\d+-\d+-\d+)" , s)
# 打印效果如下-因为处于贪婪模式,只给你留一个符合匹配的。
print(match_s.group(1 ))
print(match_s.group(2 ))
# This is a number 23
# 4-235-22-423
# 3、关闭贪婪模式
match_s1 = re.match("(.*?)(\d+-\d+-\d+-\d+)" , s)
# 这样的话只要后年有满足的条件,就让后面满足
print(match_s1.group(1 ))
print(match_s1.group(2 ))
# This is a number
# 234-235-22-423