1、定义
正则表达式是用于匹配、搜索和处理文本的字符串模式。
2、使用场景
匹配:验证数据格式、检查字符串是否符合特定模式要求等需要进行完全匹配的情况。
搜索:在文本中查找并定位满足特定模式的子字符串,例如提取感兴趣的信息、统计模式出现的频率等。
替换:查找并编辑特定模式的信息,使得可以对满足模式的字符串进行替换、修改等操作。
3、元字符
元字符(Metacharacters)是具有特殊含义的字符,它们用于表示模式中的特定规则和模式匹配操作。元字符在正则表达式中具有特殊的功能,并不直接匹配字符本身,而是用于描述匹配模式的规则。
| 元字符 | 描述 | 实践 |
|---|---|---|
| . | 匹配除换行符以外的任意单个字符 | |
| [] | 字符类,匹配方括号中包含的任意字符 | |
| [^] | 否定字符类,匹配方括号中不包含的任意字符 | |
| * | 匹配 * 前面的子表达式零次及以上 | |
| + | 匹配 + 前面的子表达式一次及以上 | |
| ? | 匹配 ? 前面的子表达式零次或一次,或指明一个非贪婪限定符 | |
| {n,m} | 花括号,匹配前面字符至少 n 次,但不超过 m 次 | |
| (xyz) | 字符集,按照确切的顺序匹配字符 xyz | |
| | | 分支结构,匹配符号前面或后面的字符 | |
| \ | 转义符,还原元字符原来的含义,匹配保留字符 [ ] ( ) { } . * + ? ^ $ \ | | |
| ^ | 从文本开始进行匹配 | |
| $ | 从文本末端进行匹配 |
4、简写字符集
简写字符集(Shorthand Character Classes)是正则表达式中用于表示常见字符类别的特殊元字符序列。它们提供了一种简洁的方式来匹配特定类型的字符。
| 简写 | 描述 | 实践 |
|---|---|---|
| . | 匹配除换行符以外的任意单个字符 | |
| \w | 匹配所有字母和数字的字符:[a-zA-Z0-9_ ] | |
| \W | 匹配非字母和数字的字符:[^\w] | |
| \d | 匹配数字:[0-9] | |
| \D | 匹配非数字:[^\d] | |
| \s | 匹配空格符:[\t \n \f \r \p {Z}] | |
| \S | 匹配非空格符:[^\s] |
5、断言
先行断言和后行断言都属于非捕获组(用于匹配模式,但不包括在匹配列表中)。
| 符号 | 描述 | 实践 |
|---|---|---|
| ?= | 正先行断言 —— 存在 | |
| ?! | 负先行断言 —— 排除 | |
| ?<= | 正后行断言 —— 存在 | |
| ?<! | 负后行断言 —— 排除 |
5.1、正先行断言
该断言认为第一部份的表达式后面必须是先行断言表达式,匹配结果仅包含与第一部分表达式匹配的文本。
5.2、负先行断言
该断言认为第一部份的表达式后面必须不是先行断言表达式,匹配结果仅包含与第一部分表达式匹配的文本。
5.3、正后行断言
该断言认为第二部分的表达式前面必须是后行断言表达式,匹配结果仅包含与第二部分表达式匹配的文本。
5.4、负后行断言
该断言认为第二部分的表达式前面必须不是后行断言表达式,匹配结果仅包含与第二部分表达式匹配的文本。
6、标志
标志也叫修正符,用来修改表达式的结果。
| 标志 | 描述 |
|---|---|
| i | 忽略大小写 |
| g | 全局搜索 |
| m | 多行匹配:锚点元字符 ^ $ 工作范围在每行的起始 |
7、贪婪匹配与惰性匹配
正则表达式默认采用贪婪匹配模式,在该模式下会匹配尽可能长的子串。可以使用 ? 将贪婪模式转化为惰性匹配模式。
贪婪模式
惰性模式
8、组和引用
组
用( )将表达式进行分组
引用
引用表达式的分组,\1表示引用第一组,\2表示引用第二组……
非捕获组
用(?:)创建无法引用的分组
9、常用正则表达式整理
| 用途 | 正则表达式 | 具体情况 |
|---|---|---|
| 匹配邮箱 | ^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$ | 只允许英文字母、数字、下划线、英文句号、以及中划线组成 |
^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$ | 名称允许汉字、字母、数字,域名只允许英文域名 | |
| 电话 | ^1(3|4|5|6|7|8|9)\d{9}$ | 手机号 |
(\d{3,4}\)|\d{3,4}-|\s)?\d{8} | 固定电话 | |
| 域名 | ^(https?:\/\/)?[a-zA-Z0-9\.]+[a-zA-Z]{2,6}(\/)?$ | |
| IP | ^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$ | |
| 校验 | ^[a-zA-Z][a-zA-Z0-9_]{4,15}$ | 字母开头,允许5-16字节,允许字母数字下划线 |
^[\u4e00-\u9fa5]{0,}$ | 汉字 | |
[^%&',;=?$\x22]+ | 禁止输入含有%&',;=?$"等字符 | |
| 数字 | ^(-?([0-9]+\.[0-9]*[1-9][0-9]*)|(-?[0-9]*[1-9][0-9]*))$ | 浮点数 |
| 密码 | ^(?=.*d)(?=.*[a-z])(?=.*[A-Z]).{8,16}$ | 必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-16之间 |
| HTML标记 | <(S*?)[^>]*>.*?</>|<.*? /> | 只能匹配部分HTML的内容,对于复杂嵌套结构无法完全匹配 |
| 身份证号码 | ^[1-9]\d{5}(1[89]|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx] |
10、正则无法完美匹配的模式
正则表达式是很强大的工具,用于匹配和处理各种文本模式。但对于一些复杂的模式,正则表达式可能无法完全满足需求。比如:经典的 {0n1n | n >= 0}、匹配回文串、嵌套结构等模式。
就得用另一种适用于处理复杂模式的工具:上下文无关文法,它是一种用于描述文本结构的形式文法,可以更灵活地处理复杂的模式。
{0n1n | n >= 0}
回文串
嵌套结构
下面是对应的上下文无关文法规则:
# 匹配 0^n1^n
grammar = r"""
start: expr
expr: "0" expr "1"
|
%import common.WS
%ignore WS
"""
# 匹配回文串
grammar = r"""
start: expr
expr: "0" expr "0"
| "1" expr "1"
| "0"
| "1"
|
%import common.WS
%ignore WS
"""
# 匹配嵌套结构
grammar = r"""
start: expr
expr: expr "+" term
| term
term: term "*" atom
| atom
atom: NUMBER
| "(" expr ")"
%import common.NUMBER
%import common.WS
%ignore WS
"""