python正则re模块

  1. 举例

    life is short, i use python
    # 我要验证这个字符串最后一个单词是不是life
    # 我想拿到这个字符串中第三个单词,
    # 都可以通过正则实现
    作用:(匹配和截取)给定的字符串是否符合正则表达式的过滤逻辑;可以通过正则表达式,从字符串中获取我们想要的特定部分。
    
  2. re模块使用

    # 导入re模块
    import re
    
    # 使用match方法进行匹配操作
    result = re.match(正则表达式,要匹配的字符串)
    
    # 如果上一步匹配到数据的话,可以使用group方法来提取数据
    result.group()
    
    # 第一个re模块函数,match:从字符串的第一个字符开始匹配
    
    # 示例
    import re
    
    # result = re.match("life", "life is short, i love python")
    result = re.match("is", "life is short, i use python")
    
    print(result)
    
    # re.match() 能够匹配出以xxx开头的字符串
    
  3. 匹配单个字符

    上面我们了解到通过re模块能够完成使用正则表达式来匹配字符串,接下来我们讲解正则表达式的单字符匹配

    import re
    
    """
    匹配任意一个字符(除了\n)
            '\r' 回车,回到当前行的行首,而不会换到下一行,如果接着输出的话,本行以前的内容会被逐一覆盖;
            '\n' 换行,换到当前位置的下一行,而不会回到行首;
            那就是windows在写入文件的时候把一个\n转换成了\r\n,\r保持不变,记事本只认\r\n
    []	匹配[]中列举的一个字符
    \d	匹配一个数字,即0-9
    \D	匹配非数字
    \s	匹配空白,即空格,tab键
    \S	匹配非空白
    \w	匹配单词字符,即a-z,A-Z,0-9,_
    \W	匹配非单词字符
    """
    
    ret = re.match(".", "M")
    # ret = re.match(".|\n", "\n")
    # ret = re.match(".", "\n", re.S) # 匹配\n的两种方法
    # ret = re.match("[.\n]", "\n")
    print(ret.group())
    
    ret = re.match("t.o", "too")
    print(ret.group())
    
    ret = re.match("t.o", "two")
    print(ret.group())
    

    其他的不讲了

  4. 匹配多个字符

    import re
    
    """
    *  匹配一个字符出现0次或者无限次
    +  匹配一个字符出现1次或者无限次
    ?  匹配一个字符出现1次或者0次
    {m}       匹配一个字符出现m次
    {m,n}  匹配一个字符出现m次到n次
    """
    
    ret = re.match("A-Z*", "Aabcdef")
    print(ret.group())
    
    # 题目1:匹配一个字符串是不是163的邮箱地址,且@符号之前有4到20位,例如hello@163.com
    
    ret1 = re.match("[a-zA-Z0-9]{4,20}@163.com", "fdfaffafa@163.com")
    print(ret1.group())
    
    # 注意点
    # 1.{}不能有空格,2.\w可以匹配汉字  3..要转义  4.结尾的问题
    # 错误示范
    ret1 = re.match("\w{4, 20}@163.com", "fdfaffafa@163.com")
    print(ret1.group())
    
  5. 匹配开头结尾

    import re
    """
    ^  匹配字符串开头
    $  匹配字符串结尾
    """
    # 题目1:匹配出163的邮箱地址,且@符号之前有4到20位,例如hello@163.com
    ret1 = re.match("\w{4,20}@163\.com$", "fdfaffafa@163.comfaf")
    print(ret1.group())
    
    # match就是从头开始匹配
    
  6. 匹配分组

    """
    |  匹配左右任意一个表达式
    (ab)   将括号中的字符作为一个分组
    \num   引用分组num匹配到的字符串
    (?P<name>) 分组起别名
    (?P=name)  引用别名为name分组匹配到的字符串
    """
    
    print("\\n")
    # |    匹配左右任意一个表达式
    ret = re.match("a|b", "a")
    print(ret.group())
    
    # (ab) 将括号中的字符作为一个分组
    ret = re.match("\w{4,20}@(163|126|qq).com", "test@163.com")
    	if ret:
           	print(ret.group(1))
    
       	# 如果打印group(1)可以得到分组的结果
       	else:
            print("不是163、126、qq邮箱")  # 不是163、126、qq邮箱
    
    
    # \num 引用分组num匹配到的字符串
    ret = re.match("<[a-zA-Z]>\w</[a-zA-Z]*>", "<html>hh</htmlbalabala>")
    print(ret.group())
    # 不行
    # 引用分组
    
    ret = re.match(r"<([a-zA-Z])>\w</\1>", "<html>hh</html>")
    print(ret.group())
    # 前面加一个r,如果不加r会出现下面的情况
    print("<([a-zA-Z])>\w</\1>")
    
    # 分组起别名,引用别名的分组
    ret = re.match(r"<(\w)><(\w)>.*</\2></\1>", "<html><h1>www.baidu.cn</h1></html>")
    print(ret.group())
    
    ret = re.match(r"<(?P<name1>\w)><(?P<name2>\w)>.*</(?P=name2)></(?P=name1)>", "<html><h1>www.baidu.cn</h1></html>")
    
    print(ret.group())
    
  7. re模块的高级用法

    import re
    
    """
    re.match() 能够匹配出以xxx开头的字符串,打印结构需要group()
    re.search()匹配出现在字符串中任意一个位置的xxx字符,打印结果需要group()
    re.findall()匹配出现在字符串中所有的xxx字符,
    re.sub()将匹配到的字符数据进行替换
    re.split()根据匹配进行切割字符串,并返回一个列表
    """
    
    import re
    
    ret = re.search(r"\d+", "阅读次数为 9999")
    print(ret.group())
    # search实现和match一样的功能是只需要在正则表达式前面加^
    
    ret = re.findall(r"\d+", "python = 9999, c = 7890, c++ = 12345")
    print(ret)  # 返回一个列表
    
    ret = re.sub(r"\d+", '998', "python = 997, java = 667")
    print(ret)  # 返回替换后的结果
    # 比字符串replace的功能强
    s = "python = 997, java = 667"
    print(s.replace("997", "998"))
    
    ret = re.split(r":| ", "info:xiaoZhang 33 shandong")
    print(ret)
    # 比字符串split功能强
    s = "info:xiaoZhang 33 shandong"
    print(s.split(' '))
    

转载于:https://my.oschina.net/u/4142063/blog/3058703

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值