Bootstrap

正则表达式

正则表达式 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 之外的 任意一个 数字 字符 
  • [^xyz] : 匹配 除 x, y, z 三个字符之外的 其他任意一个 字符

    ^ 作为在 中括号 的第一个字符时,代表 非的意思、出现在 中括号其他位置 均表示 ^

[^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
    
;