正则模块简介+常用函数

本文介绍了Python的正则表达式模块re,包括如何编译正则规则、匹配和搜索内容、提取数据。讲解了fullmatch与match的区别,以及常用符号如.、[]和量词的用法。还提到了贪婪与非贪婪匹配的概念,并通过实例展示了正则在手机号码、邮箱验证等场景的应用。
摘要由CSDN通过智能技术生成

正则模块简介+常用函数

  • 正则:regular expression 通常我们会简写regex

  • 是所有语言通用的,用来做字符串的验证

    • 比如说:qq长度验证,qq是否是纯数字,邮箱长度,开头,有没有@这么多的判断,很难去写逻辑验证
  • 可以在网页中 定义规则 拿到我们想要的内容

  • 正则需要用到的模块:re模块

  • re模块需要掌握的方法

    • 规定规则
      • 对象 = re.compile(“正则”)
    • 适配内容
      • match_obj = 对象.match(“内容”)
    • 取出内容
      • print(match_obj.group())
  • re.search(规则,内容) 提取数据

    • 简写:
    match_obj = re.match("正则","内容")
    print(match_obj.group())
    	
    思考match 是如何适配内容??
    	
    match_obj = re.match("abc","abcd")
    print(match_obj.group())
    	
    match_obj = re.match("abc","frgabc")
    print(match_obj.group())
    

  • match_obj =re.fullmatch(“正则”,“内容”)

  • 思考:full是啥意思?? full是完全

  • 思考:和match有啥区别呀?? match是匹配开头,fullmatch则是全部匹配

  • 思考如果需要 提取符合规则的字符串怎么搞

    • match_obj =re.search(“正则”,“内容”)
    • print(match_obj.group())
    • print(match_obj.span())
  • 思考span 和 group 都是什么意思??

    • 注意:search 只要找到一个匹配的 后面的就不再找了
  • ?? =re.findall(“正则”,“内容”)

    • print(??)
    • 这个方法返回的是啥???
    • 直接返回匹配的字符串
  • 正则之常用符号(.[],量词)

    • .:匹配任意字符,除了换行符 \n
  • 例如:

    match_obj = re.fullmatch("a.b","a+b")
    print(match_obj)
    

  • []:在[]任意一个都可以

  • 例如:

    match_obj = re.fullmatch("a[a-z]b","a+b")
    print(match_obj)
    
  • 注意:这些都是修饰前面 内容的

  • *:0或者更多个

  • “[a-z]*” 表示这里可以匹配0个或者多个小写字母

  • +:最少一个或者多个

    • “[0-9]+” 表示这里可以匹配1个或者多个的数字
  • ?:只有0或者1个

    • “\w?” 表示这里可以匹配0个或者1个合法字符

  • 例:验证一个字符串两头是数字,中间是字母

    import re
    str = input("请输入一个字符串")
    match_obj = re.match("^[0-9]+[a-zA-Z]+[0-9]+$",str)
    if match_obj:
        print(match_obj.group())
    else:
        print("无匹配字符串")
    
  • 正则之量词和预定义字符,判断开头和结尾

    预定义字符:
    \d:0~9
    \w:a-zA-z0-9_   数字字母下划线
    \s:空白字符
    \S:非空白字符
    \D:除了0~9 都行
    \W:特殊符号:+ - * ? >........
    
    量词:写在后面修饰前面的
    {数字}:固定长度
    {数字,}: 长度>=数字
    {n,m}: n<=长度 <=m
    

  • 例:qq号码 不能0开头 都是数字:6到9位数

    import re
    qq = input("请输入qq:")
    match_obj = re.match("^[1-9][0-9]{5,8}",qq)
    if match_obj:
        print(match_obj.group())
    else:
        print("输入有误")
    
  • 例:检测合法的变量名,有列表:[“age”,“age","__”,“1name”,“name!”,“a1”,“k#”]

import re
name_li = ["age","_age","___","1name","name!","a1","k#"]
for name in name_li:
    match_obj = re.match(r"^[a-zA-Z_]\w*$",name)

    if match_obj:
        print("合法",name)
    else:
        print("不合法",name)
  • 验证用户名: 可以是字母数字下划线,不能是数字或者_开头,用户名长度必须6位以上
import re
user_name = input("请输入用户名")

match_obj = re.match(r"[a-zA-Z]\w{5,}",user_name)

if match_obj:
    print("合法",user_name)
else:
    print("不合法")

  • 手机号码验证:1开头 可以是13/15/18xxxxxxx 11位

    import re
    num = input("请输入手机号")
    
    match_obj = re.match(r"^[1](3|5|8)[0-9]{9}",num)
    
    if match_obj:
        print("合法",num)
    else:
        print("不合法")
    
  • 座机:区号-电话号码 区号必须3或者四位 电话号码是8位数字

    import re
    num = input("请输入电话号码")
    
    match_obj = re.fullmatch(r"^[0][0-9]{2,3}([0-9]{8})",num)
    
    if match_obj:
        print("合法",num)
    else:
        print("不合法")
    
  • re.sub(“正则”,用于替换的内容,源字符串)

  • re.sub(“正则”,函数名,源字符串)

  • 先思考: 要不要参数,要不要返回值

    • def 函数名():
      pass
  • re.sub(“正则”,函数名,用于替换的内容)

  • 有字符串 = “xiaohua=20 xiaoming=21 xiaohong=19”
    将年龄>=20岁的+1

    import re
    str1 = "xiaohua=20 xiaoming=21 xiaohong=19"
    
    def change(age):
        age = int(age.group())
        if age > 19:
            age +=1
        return str(age)
    
    result = re.sub(r"\d{2}",change,str1)
    print(result)
    
  • 正则分组:

    知道引用分组匹配到的数据对应的正则表达式代码
    1. 匹配分组相关正则表达式
    	|	匹配左右任意一个表达式
    	(规则)	将括号中规则作为一个分组
    	\num	    引用分组num匹配到的字符串,保证跟分组内容一模一样
    	
    
    	(?P<name>)	分组起别名
    	(?P=name)	引用别名为name分组匹配到的字符串
    

  • 示例1:
  • 需求:在列表中[“apple”, “banana”, “orange”, “pear”],匹配apple和pear
import re
name_li=["apple", "banana", "orange", "pear"]
for name in name_li:
    match_obj = re.match("apple|pear",name)
    if match_obj:

        print(match_obj.group())
  • 示例 :分组
  • 需求:匹配出163、126、qq等邮箱,邮箱名字1到20个字母或者数字,大写字母,小写字母都可以
    思考匹配邮箱 输入111@163.comcom 或者 111@163acom
import re
email = input("请输入邮箱")
match_obj = re.match(r"\w{1,20}@(163|126|qq)\.com$",email)
if match_obj:
    print("邮箱合法",email)
else:
    print("邮箱非法")

正则之贪婪与非贪婪
  • 知道贪婪的特点

  • 掌握非贪婪的使用

  • Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;

  • 例如:(敲)

    #蔡徐坤唱跳rap#微博话题#
    现在就想拿 #蔡徐坤唱跳rap#
    import re
    str1 = "#蔡徐坤唱跳rap#微博话题#"
    match_obj = re.match("^#.*?#",str1)
    print(match_obj.group())
    
    
  • 非贪婪则相反,总是尝试匹配尽可能少的字符。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值