模块:re(正则表达式)

import re,random
# ---------------------re模块常用函数--------------------
    # (第一部分基础)
# match 默认从头开始匹配
    # (第二部分高级用法)
# search 返回第一个匹配成功的元素
# findall 以列表的形式返回所有匹配成功的元素
# sub 替换所有匹配成功的元素
# split 匹配正则进行切割

# ------------------------常用字符------------------
# 大写 D S W 都是相反的作用
# . 点是匹配任意字符
# * 星是匹配前一个字符可有可无
# + 加是匹配前一个字符出现 1-无数次,就是不可以0次
# ? 问号匹配前一个字符出现 0-1次,要么有要么没有
# ^ 尖括号判断开头
# $ 多咯判断结尾
# | 匹配左右任意一个表达式
#() 将括号中的字符作为一个分组
# \num 引用分组
# (?P<变量名>正则表达式) 变量名和正则表达式放在同一个括号内
# (?P=之前定义的变量名)

# ----------------------第一部分:正则基础-----------------------------
    # re.match(正则表达式,需要处理的字符串)
print(re.match(r'hello','hello world'))     # 如果没返回值就代表需要处理的字符串没有包括正则表达式
print(re.match(r'[hH]ello','hello world'))      # 同时匹配大小写开头的 H

# ---------------------------匹配单个字符-----------------------------------
    # /d 匹配 0-9的数字
ran = random.randint(0,9)
print(ran)
ret = re.match(r'十宗罪\d','十宗罪'+str(ran))
print(ret.group())      # group 取出匹配数据的结果
    # 第二种方法,匹配 1-8 的数字
rann = random.randint(1,8)
print(rann)
print(re.match(r'十宗罪[123456789]','十宗罪'+str(rann)).group())
print(re.match(r'十宗罪[1-37-9]','十宗罪'+str(rann)).group())        # 只取 123和789
print(re.match(r'十宗罪[1-9a-zA-Z]','十宗罪'+str(rann)).group())        # 如果要英文的
        # 上面这句的中括号可以换成 \w,\w 包括 0-1 a-z A-Z 还有 _ (下划线)
print(re.match(r'十宗罪\w','十宗罪'+str(rann)).group())      # 一般不要用,还包括中文等等
    # \s 判断空格和 Tab键
print(re.match(r'十宗罪\s\w','十宗罪 '+str(rann)).group())

# ---------------------------匹配多个字符-----------------------------------
    # 需求一: 判断用户是否输入指定个数
        # 列:手机号 11 位数
print(re.match(r'\d{11}','12345678901').group())    # 固定 11位数
print(re.match(r'十宗罪\d{1,3}','十宗罪123').group())     # 判断 1-3 位数
print(re.match(r'\d{4}-?\d{4,8}','0752-6649').group())     # ? 问号 判断前一个字符能有一个或没有

# ---------------------------匹配特殊字符-----------------------------------
html_text = '''asddsad
wocao
nicao
tacao'''    # 变量字符串原型:asddsad\nwocao\nnicao\ntaca
print(re.match(r'.*',html_text).group())        # .匹配不到 \t \n等等
print(re.match(r".*",html_text,re.S).group())       # 加上 re.S 就能匹配到了

# 实例一:判断变量名是否符合要求
name1 = ['_name1_','name2','3name','na4me','a_#']
for i in name1:
    re_name = re.match(r'[a-zA-Z_].*',i)
    if re_name:
        print(i,'正确')
    else:
        print(i,'错误')

# 实例二:判断 163邮箱地址,@ 符号前有 4-20英文字母或数字
try:
    email = input('请输入163邮箱地址:')
    re_email = re.match(r'^[a-zA-Z\d]{4,20}@163\.com$',email).group()
    if re_email:
        print('您输入的:',email,'符合要求')
except:
    print('您输入的:',email,'不符合要求')

# -----------------分组,匹配不同的字符,不同地方相同字符等-----------------
    # 例如上面的判断 163邮箱,如果还要加 QQ邮箱等
        # | 是 or的意思,()括号是分组
re_email = re.match(r'^([a-zA-Z\d]{4,20})@(163|Q{2}|q{2})\.com','260079443@qq.com')       # 如果想统计用户使用什么邮箱登录的话,可以使用下面取括号的值
print(re_email.group())
    # 取括号的值
print(re_email.group(1))    # 取第一个括号匹配成功的字符
print(re_email.group(2))    # 取第二个括号匹配成功的字符

# 如果要两个地方匹配相同字符,或判断两个不同的地方是否相同
    # 列如:抓取的网页标签,标签开头和结尾要相同
        # 调用第一组(第一个括号)分词
html_text1 = '<h1>这是相同</h1>'
print(re.match(r'<\w*>.*</\w*>', html_text1).group())      # 这样写开头标签和结尾标签可以任意
print(re.match(r'<(\w*)>.*</\1>', html_text1).group())     # 反斜杠 1 的地方就必须和第 1 个()相同
html_text2 = '<h1>这是不一样</h2>'
print(re.match(r'<\w*>.*</\w*>', html_text2).group())        # 这句不用匹配相同
print(re.match(r'<(\w*)>.*</\1>', html_text2).group())       # 只能匹配两个标签相同,所以这句会报错
    # 匹配多个标签
html_text3 = '<body><h1>多个标签</h1></body>'
print(re.match(r'<(\w*)><(\w*)>.*</\2></\1>',html_text3).group())
    # 给分组取名,给分组定义变量
        # (?P<变量名>正则表达式) 变量名和正则表达式放在同一个括号内
        # (?P=之前定义的变量名)
html_text4 = '<body><h1>多个标签</h1></body>'
print(re.match(r'<(?P<p1>\w*)><(?P<p2>\w*)>.*</(?P=p2)></(?P=p1)>',html_text3).group())


# ----------------------第二部分:高级用法-----------------------------
print(re.search('\d+','阅读次数:9999').group())
print(re.search('\d+','阅读次数:9999,点赞:100').group())        # 返回第一个匹配成功的元素
    # findall 以列表的形式返回所有匹配成功的元素
print(re.findall('\d+','阅读次数:9999,点赞:100,评论:666'))
    # sub 替换所有匹配成功的元素
print(re.sub('\d+','替换成这个','阅读次数:999,点赞:100,评论:666'))
    # split 匹配正则进行切割
print(re.split(r':|,','阅读次数:9999,点赞:100,评论:666'))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值