国际访客建议访问 Primers 编程伙伴 国际版站点 > Python 教程 > 说明 以获得更好的体验。

# 正则表达式

正则表达式(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("无效的邮箱地址")

# 基本概念

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

  • abc 匹配 abc

  • \d 匹配任意数字(0-9)

  • a*b 可用匹配 bab, aabaaaaaaaaab* 表示前一个字符出现任意次)

  • a+b 可用匹配 ab, aabaaaaaaaaab+ 表示前一个字符出现不少于一次)

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

$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 次,取最短匹配
本文 更新于: 2025-11-27 09:37:57 创建于: 2025-11-27 09:37:57