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

