• 正则表达式


    因为有很多的数据需要使用正则表达式去匹配,一般都是在网上直接搜索一个,但是也是有很多正则表达式是搜索不到的,所以不得不要自己学习一下正则表达式了.这个笔记的学习素材都是来自于胶囊网络,我是害怕自己忘记,所以就写了这个笔记.

    1.正则表达式的工具

    • 正则在线测试工具:https://regexr-cn.com/
    • 正则练习网站:https://codejiaonang.com/

    2.正则表达式

    2.1 字符匹配

    表达式: regex=“[Pp]thon”
    中括号中的内容可以选择匹配,后面的字符是一定会匹配的。
    例如:

    Python3
    python3
    ython

    2.2 匹配区间

    • 匹配数字
      表达式: regex=“[0-9]”
    • 匹配小写
      表达式: regex=“[a-z]”
    • 匹配大写
      表达式: regex=“[A-Z]”
    • 匹配大小写
      表达式: regex=“[a-zA-Z]”
      例如匹配字母数字混合体regex=“[0-9a-zA-Z]”

    abcdefg&&&
    012345678***
    987654321%%%
    ABCDEFG***

    2.3 匹配特殊字符

    • 匹配特殊字符
      表达式: 将表达式使用反斜杠【\】进行转义,就能识别了
      例如匹配下列特殊字符regex=“[][-()]”

    []
    ()

    2.4 取反

    如果想匹配除了你要匹配的内容之外的其他内容,可以使用一个^进行取反
    例如匹配爱后面不包含你的数据,regex=爱[^你]

    爱吗
    爱哦
    爱我自己
    爱了
    爱我
    我爱你
    爱你
    爱你爱你
    不爱你
    爱你一万年

    2.5 快捷匹配

    • \w:与任意单词字符匹配,任意单词字符表示 [A-Z]、 [a-z]、[0-9]、_
    • \d:与任意数字匹配
      例如使用快捷方式匹配下列的所有的单词

    master
    code
    jiaonang
    123456789
    987654321
    0123
    CODE
    JIAONANG
    hello world
    python

    2.6 特殊匹配

    • \s:匹配空白
    • \b:匹配单词的边界
    • ^开头。匹配字符串开头,或者当使用多行标志(m)时,匹配一行的开头。
    • $结尾。匹配字符串结尾,或者当使用多行标志(m)时,匹配一行的结尾。

    例如匹配下面有空白的code单词,regex=“code[\s]”

    code
    code jiaonang
    code jiaonang
    code www
    code jiaonang

    例如匹配下列被分割的单词code,regex=“\bcode\b”

    code
    code jiaonang
    code.jiaonang
    www.code
    code-jiaonang
    CODEINFO
    codeasd/
    codejiaonangA$
    JIAONANG-MASTER
    CODEJIAONANG!

    例如匹配所有的小数,regex=“^\d{1,}.\d{1,}$”

    192.168
    12.12.12.

    所有快捷方式的取反就是将小写变大写就可以了,例如:\W \D \S

    2.7匹配开头和结尾

    匹配开头用^,匹配结尾用$
    例如:匹配以python开头句子,regex=“^python”

    python 12344 Python
    居家闪客快打python

    例如匹配以python结尾的单词,regex=“python$”

    python 12344 python
    还是说python

    2.8 任意字符

    匹配任意字符可以用点【.】,但是不能匹配换行符号【\n】,【.*】就是匹配任意字符。
    例如匹配任意字符之后但是ar的字符串,regex=“.ar”

    ear
    car
    parked
    garage
    barked
    rar
    haarr
    in the
    ar
    aer
    acer
    ha ha
    anr
    and

    2.9 可选字符

    可选字符就是可以匹配也可以不匹配的字符,在这个字符后面加 一个问号,表示可选可不选
    例如:有的单词有两种表达方式,需要同时匹配这两种,例如同时匹配employ和employee,regex=“employe?e?”

    employe
    employee
    employ
    f

    2.10 匹配重复数字

    在你要匹配的字符后面加一个花括号,花括号里面填写你要重复的次数,
    例如匹配下列的电话号码,regex=\d{3}-\d{5}

    010-88480
    020-72813
    030-12345
    020-66666
    030-98788
    030-88888

    123-123
    01-72813
    0-12345
    20-66666
    0-98788
    0–808888

    2.11 匹配区间

    在要匹配的字符后面加一个区间{数字1,数字2},一般都会按照最大的那个区间匹配,如果加一个?,表示非贪婪模式,就会按照最小的那个区间去匹配.
    例如匹配下面的数字,regex=“\d{8,9}”

    4566545223
    45664585
    4552233

    例如:使用正则表达式提取电话号码,假设电话号码有两种规则:

    • 以3个数字开头,后面7个数字,例如:020-7281333
    • 以4个数字开头,后面7个数字,例如:0731-8283431
      regex=“\d{3,4}-\d{7}”

    2.12 速写

    *逗号:表示0到无穷大

    • 加号:表示1到无穷大
      例如匹配下面任意长度的数字:regex=“\d{1,}”

    4566545223
    45664585
    4552233

    例如匹配下列以f开头的数据,regex=“f.+”

    f0asd…a123—
    food
    father
    faker
    fooder
    fufufu

    f
    brather
    brathef
    arathef
    codejiaonang
    mastercode

    3.正则表达式进阶

    3.1 分组

    在你要匹配的数据前后加一个括号就是你要提取的数据

    • 例如:提取学生的电话号码:regex=“(\d{4})-(\d{7})”

    张三: 0731-7839932
    45664585
    4552233

    • 例如提取HTML表达式
      中的内容:regex=“
      (.*)

    hi

    • 例如提取学号:
      有些学校的学号是由多个关键信息组成的,例如:2019-5013-08 2019表示入学年份,5013表示班级代码,08表示班级中的排序。
      regex=“(\d{4})[-\s]?(\d{4})[-\s]?(\d{2})”
      其中中间可以是-做分隔,也可以是空格做分隔,也可没有任何分隔,则用[\s-]?表示

    2019-5013-08
    2019 5013 08
    2019501308

    3.2 或者条件

    用或符号【|】做分割就可以了
    例如提取下面.mp4、.avi、.wmv、.rmvb等视频格式
    regex=“(.mp4|.avi|.wmv|.rmvb)”

    1.avi
    abc.mp4
    chapter1.wmv
    chapter2.rmvb

    3.3非捕获分组

    有时候,我们并不需要捕获某个分组的内容,但是又想使用分组的特性。
    这个时候就可以使用非捕获组(?:表达式),从而不捕获数据,还能使用分组的功能。

    例如只要捕获下列的电话号码,但是不要捕获区号regex=“(?:\d{2}|\d{4}|tel)[-:](\d{5})”

    01-75855
    0731-75855
    12345-75855
    tel:75855

    3.4 分组的回溯引用

    因为在识别HTML标签的使用,使用下面的表达式,会识别前后不一致的HTML标签.
    例如:regex=“<\w+>(.*?)

    # 全部会被识别
    123<font>提示</font>abj
    123<font>提示</bar>abj
    
    • 1
    • 2
    • 3

    如果使用回溯,就只会识别前后一致的标签
    例如:regex=“<(\w+)>(.*?)
    其中\1代表第一个分组的内容,\2就代表第二个斜杠中的分组

    # 就只会识别这衣蛾
    123<font>提示</font>abj
    
    • 1
    • 2

    3.5 先行断言

    很多人也称先行断言和后行断言为环视,也有人叫预搜索,其实叫什么无所谓,重要的是知道如何使用它们!
    先行断言和后行断言总共有四种:
    正向先行断言
    反向先行断言
    正向后行断言
    反向后行断言

    • 正向先行断言:(?=表达式),指在某个位置向右看,表示所在位置右侧必须能匹配表达式.
      例如匹配喜欢两个字,但是喜欢的后面一个必须是你,regex=“喜欢(?=你”

    喜欢你 喜欢他 喜欢我 喜欢 喜欢

    • 反向先行断言(?!表达式)的作用是保证右边不能出现某字符。
      例如匹配喜欢后面没有你的喜欢
      regex=“喜欢(?!你)”

    喜欢你 喜欢喜欢我 喜欢 喜欢你

    3.6 后行断言

    先行断言和后行断言只有一个区别,即先行断言从左往右看,后行断言从右往左看。

    • 正向后行断言:(?<=表达式),指在某个位置向左看,表示所在位置左侧必须能匹配表达式

    例如:如果要取出喜欢两个字,要求喜欢的前面有我,后面有你,这个时候就要这么写:(?<=我)喜欢(?=你)。

    • 反向后行断言:(?

    例如:如果要取出喜欢两个字,要求喜欢的前面没有我,后面没有你,这个时候就要这么写:(?

    4.正则表达式的案例

    4.1 匹配所有手机号码

    手机号码的规则:

    • 以数字1开头
    • 第2位只能是345678
    • 长度为11位
      得到正则表达式为:regex=“^1[345678]\d{9}”

    4.2 判断密码中是否有数字大小写字母

    • 判断数字:regex=“(?=.*?[0-9])”
    • 判断大写regex=“(?=.*?[a-z])”
    • 判断小写regex=“(?=.?[A-Z])"
      得到正则表达式为:regex="(?=.
      ?[a-z])(?=.?[A-Z])(?=.?[0-9]).+”
  • 相关阅读:
    Python算法练习 10.15
    大数据知识合集之数据分析模型
    从 iPhone 人像模式导出深度图(视差图)
    网络工程师的爬虫技术之路:跨界电商与游戏领域的探索
    pdf文件损坏打不开了怎么办
    从FAST TCP到POWERTCP
    [附源码]Python计算机毕业设计SSM健身房管理系统(程序+LW)
    java计算机毕业设计考勤系统设计源码+mysql数据库+系统+lw文档+部署
    牛客—— JZ36 二叉搜索树与双向链表
    HCIP--路由策略实验
  • 原文地址:https://blog.csdn.net/qq_35653657/article/details/126558685