正则表达式入门
正则表达式入门
正则表达式是什么、r 前缀的作用,以及 re 模块的三个函数 match / search / findall 与 Match 对象
正则表达式是什么
正则表达式(Regular Expression)是一种用特定语法规则组成的字符串模式,用来描述、匹配或替换文本中符合某种规则的字符序列。
可以理解为:专门用于文本处理的”高级查找和匹配公式”。
比如”匹配一个手机号”的规则就是 1[3-9]\d{9}——1 开头、第二位是 3-9、后面再跟 9 个数字。
re 模块的三个函数
import re
s = "我的手机号是18809091231你记住了吗? 我的另一个手机号是18800001266,QQ号是1779989922你记住了吗?"
# match - 从字符串的开头开始匹配(返回 Match 对象)result = re.match(r"1[3-9]\d{9}", s)print(result) # s 以"我"开头,不是手机号 → None
# search - 从任意位置开始, 搜索第一个匹配项(返回 Match 对象)result = re.search(r"1[3-9]\d{9}", s)print(result.group()) # 18809091231
# findall - 从任意位置开始, 搜索所有匹配项(返回 list)result = re.findall(r"1[3-9]\d{9}", s)print(result) # ['18809091231', '18800001266']| 函数 | 从哪里找 | 找到几个 | 返回 |
|---|---|---|---|
re.match(规则, 文本) | 只从开头匹配 | 第 1 个 | Match 对象(匹配不到是 None) |
re.search(规则, 文本) | 任意位置 | 第 1 个 | Match 对象 |
re.findall(规则, 文本) | 任意位置 | 所有 | 列表 |
Match 对象的常用方法
result = re.search(r"1[3-9]\d{9}", s)result.group() # 匹配到的结果:'18809091231'result.span() # 匹配项的索引区间:(6, 17)result.start() # 开始索引result.end() # 结束索引字符串前面的 r 是什么
re.findall(r"1[3-9]\d{9}", s)r 表示当前字符串中的转义字符无效,按普通字符串使用。正则表达式里大量使用 \d、\w 这类反斜杠,加 r 可以避免转义歧义——写正则统一加 r。
相关
练习题
一、回忆填空(写完再展开对答案)
- 正则表达式是一种用特定语法规则组成的____,用来描述、匹配或替换文本中符合规则的字符序列
- 三个函数按”从哪里找”区分:
match从 ____ 开始;search从任意位置找第 ____ 个;findall找 ____ match和search返回 ____ 对象;findall返回 ____- Match 对象取匹配结果用 ____,取索引区间用 ____
- 字符串前的
r表示 ____,写正则时统一要加 - 匹配手机号的规则
1[3-9]\d{9}的含义:____ 开头、第二位是 ____、后面跟 9 个 ____
填空答案(做完再点开)
- 字符串模式 2. 字符串开头 / 1 / 所有 3. Match / 列表 4.
group()/span()5. 转义字符无效(按普通字符串使用) 6. 1 / 3-9 / 数字
二、裸写题
文本:s = "我的手机号是18809090000, 另一个手机号是18800008888,QQ号是155998992 和 18809091293821"
-
2-1 match 与 search 的区别 分别用
re.match和re.search按1[3-9]\d{9}找手机号,打印结果,解释为什么一个有值一个没值。提示(先自己想,实在想不出再点开)一级 · 思路:两个函数的”起点”不同 二级 · 方法:
re.match(规则, 文本)/re.search(规则, 文本)三级 · 骨架:print(re.match(r"1[3-9]\d{9}", s)) -
2-2 找出所有手机号 用一个函数把文本里所有 11 位手机号都找出来(QQ 号 155998992 只有 9 位、长串不是 1 开头第二位 3-9,都不会被匹配)。
提示一级 · 思路:要”全部”,用三个函数里的哪一个? 二级 · 方法:
re.findall(r"1[3-9]\d{9}", s)三级 · 骨架:print(re.____(r"1[3-9]\d{9}", s)) -
2-3 找出位置 用 search 找到第一个手机号后,打印它的内容、起点索引和结束索引。
提示一级 · 思路:Match 对象上有三个现成方法 二级 · 方法:
group()/start()/end()三级 · 骨架:print(result.____(), result.____(), result.____())
参考答案(做完再点开)
import re
s = "我的手机号是18809090000, 另一个手机号是18800008888,QQ号是155998992 和 18809091293821"
# 2-1:match 从开头匹配,s 以"我"开头 → None;search 任意位置 → 找到print(re.match(r"1[3-9]\d{9}", s)) # Noneprint(re.search(r"1[3-9]\d{9}", s).group()) # 18809090000
# 2-2print(re.findall(r"1[3-9]\d{9}", s)) # ['18809090000', '18800008888']# QQ 号 155998992 不是 1 开头第二位 3-9 且共 11 位,所以不会被匹配
# 2-3result = re.search(r"1[3-9]\d{9}", s)print(result.group(), result.start(), result.end())评论区
如果你喜欢,那么欢迎来到我的世界!
了解更多













