正则表达式

正则表达式 Regular Expression

和 语言无关、但大部分主流编程语言都兼容的 这种 处理 字符串的 表达式 。在 编程语言中, 通常 会将 正则表达式 简写为 regex 、 regexp 、 re

正则表达式 是对 字符串操作的 一种 扩展 和补充 。

正则表达式 可以 对 字符串 进行 检索提取替换 等操作。

正则 表达式 是由 一组 特殊 的 字符 组成的 模式匹配串 Pattern、本质上是一个字符串。在 Python 使用 Pattern 类 来表示正则表达式

RegexBuddy4.exe

这个软件 是 辅助学习 正则 匹配 规则 的软件。

正则匹配规则

基础规则

  • xyz : 匹配 字符串中的 xyz , 这里面的 xyz 是一个泛指,可以代表任意字符( 除特殊字符 )

  • xyz\] : 匹配 x , y , z 中的 任意 一个 字符 `-` 在中括号中 有特殊含义 ,可以表示一个区间 ,且 区间 均包含 , 如果 - 无法 表示区间, 则 回复原意,用来匹配 `-` [A-Z] : 匹配 26个 大写字母 [a-z] : 匹配 26个 小写 字母 [0-9] : 匹配 任意一个 阿拉伯数字 字符 [0-] : 匹配 0 或者 - [a-zA-Z0-9] : 匹配任意一个字母 或数字 字符 [0-2457-9] : 匹配 除 3 和 6 之外的 任意一个 数字 字符

    [^0-9] : 匹配任意一个 非数字 字符
    [0-9^] : 匹配任意一个 数字字符 或者 ^

  • \d : 匹配 任意一个数字字符、等价于 [0-9]

  • \D : 匹配 任意一个 非数字字符 、 等价于 [^0-9]

  • \w : 匹配 任意一个 单词(字母、数字、下划线)字符 , 等价于 [a-zA-Z0-9_] , 在 Python 中 \w 还能匹配 中文 字母

  • \W : 匹配 任意一个 非单词(字母、数字、下划线、中文字母)字符 和

  • \s : 匹配 任意一个 空白符 (空格、 制表符、换行符) 如果只匹配空格,可以直接写 空格、 制表符 \t , 换行符 \n

  • \S : 匹配 任意一个 非空白符

  • \b : 代表一个单词 边界、不能单独时候,需要配合其他正则使用

  • . : 匹配 除了 换行符 之外的 其他任意一个 字符

  • \. : 匹配一个小数点 、对特殊字符的匹配 可以使用 \ 进行转移

多字符匹配规则

X 代表 基础规则

  • X{n} : X 匹配 n 个

  • X{n,} : X 至少匹配 n 个, 尽可能多的匹配

  • X{n,m} : X 至少匹配 n 个 , 最多 匹配 m 个 , 要求 : m >= n

    1[3-9]\d{9} # 匹配一个手机号

    匹配一个邮箱 a) 有且只有一个 @符号 ,b) @符号前面的内容是 邮箱账号 , 账号由 字母、数字、下划线组成、长度 4-20

    c) @符号后面的内容格式是 xx.xx 或者 xx.xx.xx 这里面的 xx 由 字母、数字、下划线组成 。 xx 的长度,长度 2 - 5

    [a-zA-Z0-9_]{4,20}@[a-zA-Z0-9_]{2,5}(.[a-zA-Z0-9_]{2,5}){1,2}

贪婪式匹配规则

  • X* : X 至少匹配 0个 , 等价于 X{0,}

  • X+ : X 至少匹配 1个 , 等价于 X{1,}

  • X? : X 最多 匹配 1个 , 等价于 X{0,1}

    匹配一个邮箱 a) 有且只有一个 @符号 ,b) @符号前面的内容是 邮箱账号 , 账号由 字母、数字、下划线组成.

    c) @符号后面的内容格式是 xx.xx 或者 xx.xx.xx 这里面的 xx 由 字母、数字、下划线组成 。 xx 的长度

    [a-zA-Z0-9_]+@[a-zA-Z0-9_]+(.[a-zA-Z0-9_]+){1,2}

非贪婪式匹配规则

在 贪婪式匹配规则 的 后面 添加 一个 ? 形成非贪婪式匹配规则 。 非贪婪式 往往在使用的时候 不会出现在正则的尾部

如果 整个表达式 是一个 非贪婪式 , 那么 效果 和 贪婪式 是一样的

如果 非 贪婪式 前面 有表达式、 后面没有表达式 ,那么此时 非贪婪式 会 尽可能少的 匹配。

如果 非贪婪式 后面 有表达式 、后面表达式 会优先 匹配 内容,然后 前面符合要求的数据 均 交给 非贪婪式 匹配。

  • x*? : X 至少匹配 0个

  • X+? : X 至少匹配 1个

  • X?? : X 最多 匹配 1个

    \d+? : 匹配 多个数字组成 的内容, 表现和 贪婪式 相同

    3\d+? : 匹配 3和 一个数字 、 此时 非贪婪式 尽可能少的 匹配 内容

    \d+?3 : 在 字符串中 找到 第一个 3 的位置, 3前面的多个数字(至少一个) 尽可能多的匹配 。

分组 ( ... )

在编写正则表达式的时候, 可以 使用 小括号 将 某一部分规则 括起来 形成一个 组 。

分组 后 , 每一组的 匹配的 数据 可以 更加方便地 进行 提取 。 组是一个整体。

  • 非捕获分组 (?: )

    使用了 ?: 的 组 就 不在 是 组了 , 而只是 一个 整体

    复制代码
    [a-zA-Z0-9_]+@[a-zA-Z0-9_]+(?:\.[a-zA-Z0-9_]+){1,2}
  • 命名捕获分组 (?P<name>)

    在 Python 中 使用 (?P<name>) , 在 Java 或者 Javascript中 使用 (?<name>)

    复制代码
    (?<account>[a-zA-Z0-9_]+)@[a-zA-Z0-9_]+(?:\.[a-zA-Z0-9_]+){1,2}
  • 分组 引用 \n : n 是组的编号、是一个数字

    \n 代表 引用 第 n 组 正则 匹配的内容 作为 匹配的内容 。

选择 |

复制代码
编写 一个 身份证 正则表达式 ,用来 提取 年份 、月份、日 , 且 年份 必须在 1900  ~ 2099  ,  月份 01 ~ 12  , 天 01 ~ 31

[0-9]\d{5}(?P<year>(?:19|20)\d{2})(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}[0-9Xx]

限定符

限定符 一般 用来 做 数据校验

  • ^ : 如果 ^ 符号 出现在 正则表达式的 最前面, 代表 以 ... 开头 。

  • $ : 如果 $ 符号 出现在 正则表达式的 尾部 , 代表 以 ... 结尾

    [\u4e00-\u9fa5] # 匹配中文字符区间

断言(预测)

正则在前 ,断言在后 为 正向 断言。 否则为 反向 断言。

  • 正向确定断言 (?=)

    \d+?(?=5) # 匹配 数字 、且 数字 后面一定是 5

  • 正向否定断言 (?!) :

    复制代码
    \d+?(?!5)    #  匹配 数字 、且 数字 后面一定不是 5
  • 反向确定断言 (?<=)

    复制代码
    (?<=5)\d+    #  匹配 数字 且 数字 前面一定 是 5
  • 反向否定断言 (?<!)

    复制代码
    (?<!5)\d+    #  匹配 数字 且 数字 前面一定 不是 5
相关推荐
HAPPY酷4 分钟前
Python高级架构师之路——从原理到实战
java·python·算法
n 55!w !1089 分钟前
IP-vlan实验报告
服务器·网络·tcp/ip
枫叶林FYL18 分钟前
第9章 因果推理与物理理解
人工智能·算法·机器学习
扑火的小飞蛾29 分钟前
Kali Linux 安装 OpenClaw 详细教程
linux·运维·服务器
小白zlm37 分钟前
预畸变双线性变换
单片机·嵌入式硬件·算法·电机控制
王琦03181 小时前
第二次作业
linux·运维·服务器
wuweijianlove1 小时前
算法复杂度估算的实验建模与可视化表达的技术6
算法
执笔画流年呀1 小时前
7大排序算法
java·算法·排序算法
AI成长日志1 小时前
【算法学习专栏】动态规划基础·中等两题精讲(198.打家劫舍、322.零钱兑换)
学习·算法·动态规划
计算机安禾1 小时前
【数据结构与算法】第28篇:平衡二叉树(AVL树)
开发语言·数据结构·数据库·线性代数·算法·矩阵·visual studio