正则表达式学习

77 阅读4分钟

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
"""