正则表达式(Regular Expression) 是一种用于匹配和处理文本的强大工具,它使用特定语法构成的字符串来定义搜索模式。常用于匹配、查找和替换字符串中特定的部分。
例如表单校验中检查输入的邮箱地址是否正确,邮箱地址应当符合类似 __AAA__@__BBB__.__CCC__ 的格式,并且其中:
__AAA__ 部分是用户名,只能包含英文字母、数字、下划线(_)、小数点(.)、加号(+)和减号(-)
__BBB__ 部分是域名,只能包含英文字母、数字、和减号(-)
__CCC__ 部分是顶级域名,只能包含英文字母、数字、小数点(.)和减号(-)
逐个字符扫描进行校验十分繁琐,可能需要实现一个简单的有限状态机:
初始处于匹配 __AAA__ 部分的状态
扫描到英文字母、数字、下划线(_)、小数点(.)、加号(+)和减号(-)时进行记录
扫描到 @ 时进入匹配 __BBB__ 部分的状态
扫描到其它字符时返回邮箱地址 不合法
进入匹配 __BBB__ 部分时
扫描到英文字母、数字、和减号(-)时进行记录
扫描到小数点(.)时进入匹配 __CCC__ 部分
扫描到其它字符时返回邮箱地址 不合法
进入匹配 __CCC__ 部分时
扫描到英文字母、数字、小数点(.)和减号(-)时进行记录
扫描到其它字符时返回邮箱地址 不合法
扫描到末尾时返回邮箱地址 合法
而使用正则表达式 ^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$ 对邮箱地址进行全文匹配就变得十分简单:
import re
# 验证电子邮件格式
email_pattern = r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$' # 正则表达式
if re.match(email_pattern, input("请输入你的邮箱地址:")):
print("有效的邮箱地址")
else:
print("无效的邮箱地址")
正则表达式是由普通字符(如字母a-z)和特殊字符(称为“元字符”)组成的特殊字符串,例如:
abc 匹配 abc
\d 匹配任意数字(0-9)
a*b 可用匹配 b,ab, aab,aaaaaaaaab(* 表示前一个字符出现任意次)
a+b 可用匹配 ab, aab,aaaaaaaaab(+ 表示前一个字符出现不少于一次)
你可用使用下面的正则表达式校验工具体验一下:
$include(/resource/html/regexp.html)
| 元字符 | 含义 | 示例 |
|---|---|---|
. |
匹配任意一个字符(除换行符) | a.c -> abc, a1c |
^ |
匹配字符串开头 | ^abc -> abcxxxx |
$ |
匹配字符串结尾 | abc$ -> xxxxabc |
* |
匹配前一个字符出现 0次或多次 | a* -> "", a, aa |
+ |
匹配前一个字符出现 1次或多次 | a+ -> a, aa |
? |
匹配前一个字符 0次或1次 | a? -> "", a |
{n} |
匹配前一个字符 n 次 | a{2} -> aa |
{min, } |
匹配前一个字符 至少 min 次 | a{2,} -> aa, aaa, aaaa |
{min, max} |
匹配前一个字符 min 次至 max 次 | a{2,3} -> aa, aaa |
[] |
匹配括号内的任意一个字符 | [abc] -> a, b, c |
[^] |
匹配不在括号内的任意一个字符 | [^abc] -> d, e, f |
[-] |
表示范围 | [a-z] -> a, b, y, z |
() |
分组,会创建子匹配 | (abc)+ -> abc, abcabc |
\| |
或 | abc\|xyz -> abc, xyz |
\d |
匹配任意数字,等价于 [0-9] |
\d -> 1, 2, 3 |
\D |
匹配任意非数字,等价于 [^0-9] |
\D -> a, b, _, @ |
\w |
匹配任意字母、数字、下划线,等价于 [a-zA-Z0-9_] |
\w -> a, 1, _ |
\W |
匹配任意非字母、数字、下划线,等价于 [^a-zA-Z0-9_] |
\W -> @, # |
\s |
匹配任意空白字符(空格,\n, \r, \t 等) |
\s -> |
\S |
匹配任意非空白字符 | \S -> a, 1 ,@ |
\b |
匹配单词边界 | \bcat\b -> This is a cat 中的 cat |
\B |
匹配非单词边界 | \Bcat\B -> scatter 中的 cat |
\r |
回车符 | |
\n |
换行符 | |
\f |
换页符 | |
\t |
制表符 | |
\v |
垂直制表符 | |
\ |
转义字符,使后面的特殊字符表示字符本身而非特殊含义 | \+ -> + |
在默认情况下,使用贪婪模式,即可以匹配不同长度时匹配最长的长度。如果追加额外的 ? 则使用懒惰模式,即可以匹配不同长度时匹配最短的长度。
| 贪婪模式 | 说明 | 懒惰模式 | 说明 |
|---|---|---|---|
.* |
零次或多次,取最长匹配 | .*? |
零次或多次,取最短匹配 |
.+ |
一次或多次,取最长匹配 | .+? |
一次或多次,取最短匹配 |
.? |
零次或一次,取最长匹配 | .?? |
零次或一次,取最短匹配 |
.{n,m} |
n 至 m 次,取最长匹配 | .{n,m}? |
n 至 m 次,取最短匹配 |
.{n,} |
至少 n 次,取最长匹配 | .{n,m}? |
至少 n 次,取最短匹配 |