循环处理多组数据
本文最后更新于2 天前,其中的信息可能已经过时,如有错误请发送邮件到184874483@qq.com

1. 题目考点

这道题主要考:

正则表达式、字符串判断、输入输出、循环处理多组数据。

题目的核心不是计算,而是判断一个字符串是否满足某种格式。只要格式满足,就输出 YES;否则输出 NO


2. 审题:先把题目条件翻译成人话

题目说:

A valid mobile number is a ten digit number starting with a 7, 8 or 9.

也就是一个有效手机号必须同时满足两个条件:

  1. 一共是 10 位;
  2. 第一位必须是 789
  3. 后面 9 位都必须是数字。

注意:输入的每一行是一个字符串,不一定全是数字。

例如:

9587456281

第一位是 9,总共 10 位,全是数字,所以是合法的。

再看:

1252478965

虽然是 10 位数字,但第一位是 1,不是 789,所以不合法。


3. 思路提示:先不要急着写正则

这类题可以先把判断条件拆开:

一个字符串 s 要合法,需要满足:

第一位是 7/8/9 + 后面还有 9 个数字 + 整个字符串刚好结束

把这个思路翻译成正则表达式就是:

^[789]\d{9}$

这个正则可以拆开理解:

正则部分含义
^从字符串开头开始匹配
[789]第一位只能是 7、8、9 中的一个
\d一个数字
{9}前面的数字重复 9 次
$到字符串结尾为止

所以:

^[789]\d{9}$

整体意思就是:

从开头开始,第一位是 789,后面正好有 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 位验证码。

要求:

  1. 必须正好是 6 位;
  2. 每一位都必须是数字;
  3. 不能包含字母、空格或符号。

示例:

123456

输出:

YES

示例:

12345a

输出:

NO

提示:可以思考这个正则:

^\d{6}$
文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇