
1. 题目考点
这道题主要考:
正则表达式、字符串判断、输入输出、循环处理多组数据。
题目的核心不是计算,而是判断一个字符串是否满足某种格式。只要格式满足,就输出 YES;否则输出 NO。
2. 审题:先把题目条件翻译成人话
题目说:
A valid mobile number is a ten digit number starting with a 7, 8 or 9.
也就是一个有效手机号必须同时满足两个条件:
- 一共是 10 位;
- 第一位必须是
7、8或9; - 后面 9 位都必须是数字。
注意:输入的每一行是一个字符串,不一定全是数字。
例如:
9587456281
第一位是 9,总共 10 位,全是数字,所以是合法的。
再看:
1252478965
虽然是 10 位数字,但第一位是 1,不是 7、8、9,所以不合法。
3. 思路提示:先不要急着写正则
这类题可以先把判断条件拆开:
一个字符串 s 要合法,需要满足:
第一位是 7/8/9 + 后面还有 9 个数字 + 整个字符串刚好结束
把这个思路翻译成正则表达式就是:
^[789]\d{9}$
这个正则可以拆开理解:
| 正则部分 | 含义 |
|---|---|
^ | 从字符串开头开始匹配 |
[789] | 第一位只能是 7、8、9 中的一个 |
\d | 一个数字 |
{9} | 前面的数字重复 9 次 |
$ | 到字符串结尾为止 |
所以:
^[789]\d{9}$
整体意思就是:
从开头开始,第一位是 7、8 或 9,后面正好有 9 个数字,然后字符串结束。
4. 完整设计思路
这道题可以分成 3 步。
第一步,读入整数 N,表示后面有多少个字符串要判断。
第二步,循环 N 次,每次读入一个字符串 number。
第三步,用正则表达式判断这个字符串是否符合规则。如果符合,输出 YES;否则输出 NO。
这里要特别注意:必须判断整个字符串,而不是只判断字符串的一部分。
比如:
9587456281abc
如果只看前 10 位,它好像是合法的;但整个字符串包含字母,所以应该输出 NO。
因此正则里面必须使用:
^
$
它们的作用是限制“从头到尾完整匹配”。
5. 代码实现
import re
n = int(input())
pattern = r'^[789]\d{9}$'
for _ in range(n):
number = input().strip()
if re.match(pattern, number):
print("YES")
else:
print("NO")
这里的:
import re
表示导入 Python 的正则表达式模块。
pattern = r'^[789]\d{9}$'
这里的 r'' 表示原始字符串,写正则表达式时通常建议这样写,避免反斜杠 \ 被 Python 提前处理。
6. 运行演示
样例输入:
2
9587456281
1252478965
程序先读入:
n = 2
说明后面有 2 个字符串要判断。
第一次循环:
number = "9587456281"
判断过程:
第一位是 9,符合
后面 9 位都是数字,符合
总长度刚好 10 位,符合
所以输出:
YES
第二次循环:
number = "1252478965"
判断过程:
第一位是 1,不是 7、8、9
所以输出:
NO
最终输出:
YES
NO
7. 也可以不用正则,但这题建议用正则
如果不用正则,也可以这样判断:
n = int(input())
for _ in range(n):
number = input().strip()
if len(number) == 10 and number[0] in "789" and number.isdigit():
print("YES")
else:
print("NO")
这个写法更接近普通逻辑判断。
不过题目本身是在练习 Regular Expressions,所以更推荐掌握这一句:
^[789]\d{9}$
8. 方法总结:这类正则题怎么下手
遇到这种“判断格式是否合法”的题,不要一开始就背正则。先把条件拆成人话:
开头是什么?
中间是什么?
长度是多少?
结尾有没有限制?
然后再翻译成正则:
开头限制 → ^
某几个字符之一 → []
数字 → \d
重复次数 → {次数}
结尾限制 → $
这道题的核心模板就是:
r'^[789]\d{9}$'
以后遇到类似题,可以按这个顺序想:
先确定第一位
再确定后面几位
最后用 ^ 和 $ 限制整个字符串
9. 小练习
请判断一个字符串是否是合法的 6 位验证码。
要求:
- 必须正好是 6 位;
- 每一位都必须是数字;
- 不能包含字母、空格或符号。
示例:
123456
输出:
YES
示例:
12345a
输出:
NO
提示:可以思考这个正则:
^\d{6}$



