正则表达式语法
正则表达式语法
正则表达式的字符类(\d \w \s 等)、量词(* + ? {})、分组与锚点(^ $),以及分组提取日期
两张表记住正则语法
字符类:匹配”什么”
| 表达式 | 描述 |
|---|---|
| 普通字符 | 字母、数字、汉字及大多数字符,直接匹配自身 |
. | 匹配任意一个字符(除 \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 次 |
| ` | ` |
() | 将括号中的字符作为一个分组 |
^ | 匹配字符串开头 |
$ | 匹配字符串结尾 |
同一个手机号规则可以有多种写法,严格程度不同:1[3-9]\d*(后面随便几位)→ 1[3-9]\d{9}(正好 9 位)→ ^1[3-9]\d{9}$(整串必须是一个手机号)。
实战示例
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 或 8print(re.findall(r"1[3-9]\d{8}", s1)) # 第二位是 3 到 9print(re.findall(r"^1[3-9]\d{9}$", s1)) # 整串必须是一个手机号 → 匹配不到print(re.findall(r"\w+@\w+\.\w+", s1)) # 提取邮箱分组:findall 会返回元组
给正则的一部分加 (),findall 返回的就不再是整串,而是每个分组各占一个位置的元组:
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')] 分组\w 默认会匹配中文等”其它语言字符”。只要英文数字时加第三个参数 re.ASCII:re.findall(r"\w+", s, re.ASCII)。
相关
练习题
一、回忆填空(写完再展开对答案)
.匹配任意一个字符(除 ____)\d匹配 ____;\D匹配 ____;\w匹配 ____\s匹配空白字符,即空格和 ____*出现任意次;+至少 ____ 次;?至多出现 ____ 次{m,n}表示出现 ____ 到 ____ 次|表示 ____;()表示将括号中的字符作为一个 ____^匹配字符串 ____;$匹配字符串 ____[^38]匹配 ____;[3-9]匹配 ____- 给分组加括号后,
findall返回的每个元素是一个 ____
填空答案(做完再点开)
\n2. 数字 0-9 / 非数字 / 单词字符(a-z、A-Z、0-9、_) 3.\t4. 1 / 1(0 或 1) 5. m、n 6. 或 / 分组 7. 开头 / 结尾 8. 非 3 非 8 / 3 到 9 9. 元组
二、裸写题
文本:s = "现在的时间是2026-02-06 10:05:25, 今天的天气还可以, 气温是28度"
-
2-1 提取日期 提取文本中的日期(形如 2026-02-06)。
提示(先自己想,实在想不出再点开)一级 · 思路:4 位数字-2 位-2 位的固定模式 二级 · 方法:
re.findall(r"\d{4}-\d{2}-\d{2}", s)三级 · 骨架:{4}、{2}都是量词 -
2-2 分组提取年月日 让 findall 直接返回
[('2026', '02', '06')]这种形式。提示一级 · 思路:给要单独拿出来的部分加括号 二级 · 方法:
r"(\d{4})-(\d{2})-(\d{2})"三级 · 骨架:返回的是元组列表,可以再解包 -
2-3 提取邮箱 从
s3 = "联系我:python666@163.com 或 support@itcast.cn"中提取两个邮箱。提示一级 · 思路:邮箱 = 单词字符 @ 单词字符 . 单词字符 二级 · 方法:
\w+@\w+\.\w+三级 · 骨架:.前面要加\转义(. 表示真正的点)
参考答案(做完再点开)
import re
s = "现在的时间是2026-02-06 10:05:25, 今天的天气还可以, 气温是28度"
# 2-1print(re.findall(r"\d{4}-\d{2}-\d{2}", s)) # ['2026-02-06']
# 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)
# 2-3s3 = "联系我:python666@163.com 或 support@itcast.cn"print(re.findall(r"\w+@\w+\.\w+", s3)) # ['python666@163.com', 'support@itcast.cn']评论区
如果你喜欢,那么欢迎来到我的世界!
了解更多













