Skip to content

两张表记住正则语法 ​

字符类:匹配"什么" ​

表达式描述
普通字符字母、数字、汉字及大多数字符,直接匹配自身
.匹配任意一个字符(除 \n)
\d匹配数字 0-9
\D匹配非数字
\w匹配单词字符,即 a-z、A-Z、0-9、_(默认还含其它语言字符)
\W匹配非单词字符
\s匹配空白字符,即空格、\t
\S匹配非空白字符
[38]字符集:匹配 3 或 8
[^38]反向字符集:匹配非 3、8
[3-9]范围:匹配 3 到 9

量词与定位:匹配"几次"、"在哪" ​

表达式描述
*出现任意次(0 次或无数次)
+至少出现 1 次
?至多出现一次(0 次或 1 次)
{m}出现 m 次
{m,}至少出现 m 次
{m,n}出现 m 到 n 次
``
()将括号中的字符作为一个分组
^匹配字符串开头
$匹配字符串结尾

TIP

同一个手机号规则可以有多种写法,严格程度不同:1[3-9]\d*(后面随便几位)→ 1[3-9]\d{9}(正好 9 位)→ ^1[3-9]\d{9}$(整串必须是一个手机号)。

实战示例 ​

python
import re

s1 = "18809090000是我的手机号,188开头的;我的另一个手机号是15500008888,两个QQ号分别是1259989092和13809091293821,邮箱为python666@163.com,请给我发邮件。"

print(re.findall(r"188\d{8}", s1))     # {8} 正好 8 位数字
print(re.findall(r"155\d{6,10}", s1))  # 6 到 10 位
print(re.findall(r"1[38]\d{8}", s1))   # 第二位是 3 或 8
print(re.findall(r"1[3-9]\d{8}", s1))  # 第二位是 3 到 9
print(re.findall(r"^1[3-9]\d{9}$", s1)) # 整串必须是一个手机号 → 匹配不到
print(re.findall(r"\w+@\w+\.\w+", s1)) # 提取邮箱

分组:findall 会返回元组 ​

给正则的一部分加 (),findall 返回的就不再是整串,而是每个分组各占一个位置的元组:

python
s2 = "现在的时间是2026-02-06 10:05:25, 今天的天气还可以"

print(re.findall(r"\d{4}-\d{2}-\d{2}", s2))          # ['2026-02-06'] 整串
print(re.findall(r"(\d{4})-(\d{2})-(\d{2})", s2))     # [('2026', '02', '06')] 分组

NOTE

\w 默认会匹配中文等"其它语言字符"。只要英文数字时加第三个参数 re.ASCII:re.findall(r"\w+", s, re.ASCII)。

相关 ​

练习题 ​

一、知识回顾(读完直接做下面的实践题) ​

  1. . 匹配任意一个字符(除 \n)
  2. \d 匹配数字 0-9;\D 匹配非数字;\w 匹配单词字符(a-z、A-Z、0-9、_)
  3. \s 匹配空白字符,即空格和 \t
  4. * 出现任意次;+ 至少 1 次;? 至多出现 1(0 或 1) 次
  5. {m,n} 表示出现 m 到 n 次
  6. | 表示或;() 表示将括号中的字符作为一个分组
  7. ^ 匹配字符串开头;$ 匹配字符串结尾
  8. [^38] 匹配非 3 非 8;[3-9] 匹配 3 到 9
  9. 给分组加括号后,findall 返回的每个元素是一个元组

二、裸写题 ​

文本:s = "现在的时间是2026-02-06 10:05:25, 今天的天气还可以, 气温是28度"

  • - 提示(先自己想,实在想不出再点开)

    一级 · 思路:4 位数字-2 位-2 位的固定模式 二级 · 方法:re.findall(r"\d{4}-\d{2}-\d{2}", s)三级 · 骨架:{4}、{2} 都是量词

    - 参考答案(做完再点开)

    python
    import re
    
    s = "现在的时间是2026-02-06 10:05:25, 今天的天气还可以, 气温是28度"
    
    # 2-1
    print(re.findall(r"\d{4}-\d{2}-\d{2}", s))       # ['2026-02-06']
  • - 提示(先自己想,实在想不出再点开)

    一级 · 思路:给要单独拿出来的部分加括号 二级 · 方法:r"(\d{4})-(\d{2})-(\d{2})"三级 · 骨架:返回的是元组列表,可以再解包

    - 参考答案(做完再点开)

    python
    import re
    
    s = "现在的时间是2026-02-06 10:05:25, 今天的天气还可以, 气温是28度"
    
    # 2-2(分组后返回元组)
    print(re.findall(r"(\d{4})-(\d{2})-(\d{2})", s)) # [('2026', '02', '06')]
    year, month, day = re.findall(r"(\d{4})-(\d{2})-(\d{2})", s)[0]
    print(year, month, day)
  • - 提示(先自己想,实在想不出再点开)

    一级 · 思路:邮箱 = 单词字符 @ 单词字符 . 单词字符 二级 · 方法:\w+@\w+\.\w+三级 · 骨架:. 前面要加 \ 转义(. 表示真正的点)

    - 参考答案(做完再点开)

    python
    import re
    
    # 2-3
    s3 = "联系我:python666@163.com 或 support@itcast.cn"
    print(re.findall(r"\w+@\w+\.\w+", s3))           # ['python666@163.com', 'support@itcast.cn']