You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中[i:i+12]切片语法解析——基于手机号匹配练习

问题:理解手机号匹配代码中的chunk = message[i:i+12]工作原理

我正在学习《Python编程快速上手:让繁琐工作自动化》(Automate the Boring Stuff with Python),目前在完成一个文本中匹配###-###-####格式手机号的练习。以下是实现匹配逻辑的代码,我对其中的chunk = message[i:i+12]这行代码的工作原理存在疑问,希望得到帮助:

def isPhoneNumber(text):
    if len(text) != 12:
        return False
    for i in range(0, 3):
        if not text[i].isdecimal():
            return False
    if text[3] != '-':
        return False
    for i in range(4, 7):
        if not text[i].isdecimal():
            return False
    if text[7] != '-':
        return False
    for i in range(8, 12):
        if not text[i].isdecimal():
            return False
    return True

message = 'Call me at 415-555-1011 tomorrow. 415-555-9999 is my office.'
for i in range(len(message)):
    chunk = message[i:i+12]
    if isPhoneNumber(chunk):
        print('Phone number found: ' + chunk)
print('Done')

解答

咱们从核心的Python语法和代码设计逻辑两方面拆解这行代码:

首先,message[i:i+12]是Python字符串的切片语法:
它的规则是从字符串message的第i个索引位置开始,截取到第i+12个索引位置(注意:切片是左闭右开的——包含起始索引i的字符,但不包含结束索引i+12的字符)。最终会得到一段长度为12的子字符串(如果i+12超过了message的总长度,会自动截取到字符串末尾,但你的isPhoneNumber函数会先检查输入长度是否为12,不符合就直接返回False,所以这种短片段不会影响结果)。

然后说为什么要截取12个字符:
你要匹配的###-###-####格式手机号,算上两个连字符总长度正好是12:3位区号 + 1个- + 3位中间段 + 1个- + 4位尾号 = 3+1+3+1+4=12个字符。而你的isPhoneNumber函数只接受长度为12的输入进行验证,所以必须每次从原文本中截出12字符的片段来检查。

结合外层的循环for i in range(len(message))来看:
这个循环会遍历原文本message的每一个字符的索引位置(从0到len(message)-1)。每一次循环,我们从当前索引i开始截出12字符的片段chunk,再传给验证函数判断是不是符合手机号格式。

举个实际场景的例子:当循环到i正好指向message中415-555-1011的第一个4的索引位置时,chunk就会是完整的'415-555-1011',这时候isPhoneNumber会逐一验证每一位的规则,最终返回True,这段手机号就被打印出来了。


内容的提问来源于stack exchange,提问作者ghost

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:27:16