• 重制版 day 17 正则表达式


    正则表达式

    正则表达式是一种让一些复杂的字符串问题变得简单的工具

    正则并不是python特有的语法,所有高级编程语言都支持正则,语法通用

    python的re模块是python用来支持正则表达式的一个模块,包含了所有和正则相关的函数

    from re import *
    
    • 1

    正则表达式语法

    匹配类符号

    1)普通符号 - 在正则表达式中表示符号本身的符号

    2). --匹配任意字符

    3)\d-匹配任意一个数字字符

    4)\s-匹配任意一个空白字符

    空白字符:能产生空白效果的字符。例如:空格,换行(\n),水平制表符(\t)

    5)\D-匹配任意一个非数字字符

    6)\S-匹配任意一个非空白字符

    7)[字符集]-匹配字符集中任意一个字符,不用逗号隔开,直接写字符

    [abc] --匹配a或者b或者c
    [abc\d] --匹配a或者b或者c或者任意数字
    [1-9] -匹配1到9中的任意一个数字
    [a-z] -匹配任意一个小写字母
    [A-Z] -匹配任意一个大写字母
    [a-zA-Z] -匹配任意一个字母
    [a-zA-Z\d_] -匹配任意一个字母数字下划线
    [\u4e00-\u9fa5] -匹配任意一个中文字符

    8)[^字符集]-匹配不在字符集中的任意字符

    匹配次数

    1.*次数—0次或者多次(任意次数)

    匹配符号*,*号在谁的后面,控制的就是谁的次数

    a*-0个或者多个a

    \d* - 0个或者多个数字

    2.+-一次或者多次(至少一次)

    3.?-0次或者1次

    4.{}

    {M,N} --M到N次

    {M,} – 至少M次

    {,N} — 最多N次

    {N} – N次

    # 练习:写一个正则,判断输入的内容是否是一个合法的QQ号(长度是5~12位的数字,第一位不能是0)
    num=input('请输入qq:')
    result=fullmatch(r'[1-9]\d{4,11}',num)
    if result:
        print(f'{num}合法')
    else:
        print(f'{num}不合法')
    # 练习:判断输入的内容是否是一个合法的标识符(由字母、数字下划线组成,数字不能开头)
    str=input('请输入标识符:')
    result=fullmatch(r'[a-zA-Z_][\da-zA-Z_]*',str)
    if result:
        print(f'{str}合法')
    else:
        print(f'{str}不合法')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    贪婪和非贪婪

    贪婪和非贪婪:当匹配次数不确定的时候,匹配模式分为贪婪和非贪婪,默认是贪婪的

    贪婪取最多次数对应的匹配结果,非贪婪取最少次数对应的匹配结果

    贪婪模式: *,+,?,{M,N},{M,},{,N}

    非贪婪模式:*?,+?,??,{M,N}?,{M,}?,{,N}? --在贪婪模式后面加一个问号变成非贪婪

    注意:如果匹配结果只有一种可能,贪婪和非贪婪的结果一样

    分组

    分组-()

    1)整体-将正则表达式中的一部分作为一个整体进行相关操作,括起来的部分看作一个整体

    2)重复-在正则表达式中通过\M(M:任意正整数),来重复他前面第M个分组的匹配结果

    3)捕获-只获取正则表达式中一部分匹配的结果(分为手动和自动捕获),一般是捕获括号里的内容

    message = '我今年18岁,年薪500000元,身高188,体重78公斤,8块腹肌。每年交300元的腾讯会员费。房贷每月3888元,车贷每月2290元。'
    result=findall(r'(\d+)元9',message)
    print(result)  # ['500000', '300', '3888', '2290']
    
    • 1
    • 2
    • 3

    分支

    正则1|正则2|正则3…匹配可以和多个正则中任意一个正则匹配的字符串

    # 匹配一个字符串是三个数字或者两个小写字母
    result=fullmatch(r'\d{3}|[a-z]{2}','mk')
    print(result)
    
    • 1
    • 2
    • 3

    转义符号

    正则表达式中的转义符号,想要变成普通符号,在转义符号前加\

    [ ]里的单独有特殊意义的转义符号,在[]中特殊意义会自动消失

    如果在[ ]里有特殊功能的符号,想要变成普通符号也要加\,如减号-,^

    检测类符号

    检测类符号是在匹配成功的情况下,检测检测类符号所有位置是否符合相关要求

    1.\b-检测是否有单词边界

    2.\B-检测是否不是单词边界

    3.^-检测是否是字符串开头

    4.$-检测是否是字符串结尾

    单词边界:可以将两个单词区分开的符号都是单词边界,比如:空白符号,英文标点,字符串开头结尾

    re模块常用函数

    1.常用函数

    1)fullmatche(正则表达式,字符串)-完全匹配,判断整个字符串是否匹配正则表达式,匹配成功返回匹配对象,失败返回空值

    result=fullmatch(r'\d{3}','234')
    print(result)
    
    • 1
    • 2

    2)match(正则表达式,字符串)-匹配字符串开头,判断字符串开头是否匹配正则表达式,匹配成功返回匹配对象,失败返回空值

    3)search(正则表达式,字符串)-获取字符串中第一个匹配正则表达式的子串,找到返回对象,失败返回空值

    4)findall(正则表达式,字符串)-获取字符串中所有满足正则表达式的子串,返回一个列表,列表的元素是字符串

    5)finditer(正则表达式,字符串)-获取字符串中所有满足正则的字串,返回一个迭代器,迭代器的元素是每个子串对应的匹配结果

    6)split(正则表达式,字符串)-将字符串中所有满足正则表达式的子串作为切割点进行切割

    str1='123a8knknbk,lkanlj2blkl=='
    # 将srt1中a和b作为切割点进行切割
    result=split(r'a|b',str1)
    print(result)  # ['123', '8knkn', 'k,lk', 'nlj2', 'lkl==']
    
    • 1
    • 2
    • 3
    • 4

    7)sub(正则表达式,字符串1,字符串2)-将字符串2中所有满足正则表达式的子串替换成字符串1

    str1='123a8knknbk,lkanlj2blkl=='
    result=sub(r'\d+','+',str1)
    print(result) # +a+knknbk,lkanlj+blkl==
    
    • 1
    • 2
    • 3

    2.匹配对象

    直接获取整个正则表达式对应的匹配结果: 匹配对象.group()

    手动捕获某个分组对应的匹配结果:匹配对象.group(分组数)

    获取匹配结果在原字符串中的位置:匹配对象.span()

    3.参数

    1)匹配忽略大小写 –(?i)正则表达式在正则表达式前面加一个(?i)

    2)单行匹配-(?s)正则表达式在正则表达式前面加一个(?s)

    多行匹配(默认)-匹配的时候.不能和换行\n进行匹配

    单行匹配-匹配的时候.可以和换行\n进行匹配

  • 相关阅读:
    linux服务器更改网络配置
    Leadshop开源商城小程序源码 – 支持公众号H5
    基于nodejs+vue小型企业银行账目管理系统
    Springboot基于Restful风格
    MMRazor理解
    白金奖设计作品:给你一支笔,你便是艺术家
    SQL连接查询优化[姊妹篇.第五弹]
    python pip本地安装第三方包以及其他常用命令
    ubuntu 16.04 无法安装php7.4(16.04如何安装php7.4)
    tomcat 服务器
  • 原文地址:https://blog.csdn.net/Feifei_peng/article/details/126255824