5289

26 分钟

#正则表达式

正则表达式(Regular Expression) 是一种用于匹配和处理文本的强大工具,它使用特定语法构成的字符串来定义搜索模式。常用于匹配、查找和替换字符串中特定的部分。

例如表单校验中检查输入的邮箱地址是否正确,邮箱地址应当符合类似 __AAA__@__BBB__.__CCC__ 的格式,并且其中:

  • __AAA__ 部分是用户名,只能包含英文字母、数字、下划线(_)、小数点(.)、加号(+)和减号(-
  • __BBB__ 部分是域名,只能包含英文字母、数字、和减号(-
  • __CCC__ 部分是顶级域名,只能包含英文字母、数字、小数点(.)和减号(-

逐个字符扫描进行校验十分繁琐,可能需要实现一个简单的有限状态机:

  1. 初始处于匹配 __AAA__ 部分的状态
    • 扫描到英文字母、数字、下划线(_)、小数点(.)、加号(+)和减号(-)时进行记录
    • 扫描到 @ 时进入匹配 __BBB__ 部分的状态
    • 扫描到其它字符时返回邮箱地址 不合法
  2. 进入匹配 __BBB__ 部分时
    • 扫描到英文字母、数字、和减号(-)时进行记录
    • 扫描到小数点(.)时进入匹配 __CCC__ 部分
    • 扫描到其它字符时返回邮箱地址 不合法
  3. 进入匹配 __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("无效的邮箱地址")

>>> Establishing WebAssembly Runtime.

>>> Standby.

Powered by Shift.

#基本概念

正则表达式是由普通字符(如字母a-z)和特殊字符(称为“元字符”)组成的特殊字符串,例如:

  • abc 匹配 abc
  • \d 匹配任意数字(0-9)
  • a*b 可用匹配 bab, aabaaaaaaaaab* 表示前一个字符出现任意次)
  • a+b 可用匹配 ab, aabaaaaaaaaab+ 表示前一个字符出现不少于一次)

你可用使用下面的正则表达式校验工具体验一下:

正则表达式测试

正则表达式校验工具

#元字符

元字符含义示例
.匹配任意一个字符(除换行符)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 次,取最短匹配

创建于 2025/5/13

更新于 2025/6/8