正则表达式 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