Python 为什么第二个示例不能正常工作

Python 为什么第二个示例不能正常工作,python,Python,当我执行第二个示例时,程序返回1007332209,不带第一个零。为什么?问题的核心是s.find(char)部分。在你的例子中 def collect_num(s): ''' (str) -> str retruns the phone num from the string s. >>> collect_num('my phone mumber is 01120190637') 01120190637 >>>

当我执行第二个示例时,程序返回1007332209,不带第一个零。为什么?

问题的核心是
s.find(char)
部分。在你的例子中

def collect_num(s):
    ''' (str) -> str

    retruns the phone num from the string s.

    >>> collect_num('my phone mumber is 01120190637')
    01120190637
    >>> collect_num('My number in 2020 is 01007332209')
    01007332209
    '''

    num = ''

    for char in s:
        if char.isdigit() and s[s.find(char):s.find(char) + 11].isdigit():
            num = s[s.find(char):s.find(char) + x]

            return num
请注意,在2020年出现了字符
'0'
,以及手机号码。因此,
s.find('0')
将在2020年返回0的位置,而不是手机号码的开头。根据str.find()将

返回在切片s中找到子字符串sub的字符串中的最低索引

这种情况下的最低指数是2020年的0

作为OP的参考,这里有一个替代实现,它使用
enumerate()
进行显式索引

def收集数量:
对于i,在枚举中:
候选人=s[i:i+11]
如果candidate.isdigit():
返回候选人
return-1#表示找不到手机号码

要从字符串中获取长度为5或5以上的连续数字字符串,请执行以下操作:

'My number in 2020 is 01007332209'
结果:

import re

def collect_num(s):
    return re.search(r"\d{5,}", s).group()

print(collect_num('my phone number is 01120190637'))
print(collect_num('my number in 2020 is 01007332209'))

另外,为了可读性和性能,请使用局部变量。您不断地反复调用
s.findchar(char)
。你只需要打一次电话。使用
digit\u index=s.findchar(char)
。问题在于这一行
s[s.find(char):s.find(char)+11]
实际上您得到的是
s 010073322,020中的数字是0100,1007332209
在第二秒内不能产生,因为
2020
也是一个数字&apply isdigit返回true,它将作为开始索引。注意,
.find
查找字符串中第一个出现的内容。。或者,您可以使用索引进行迭代,而不是使用
.find
。这是一个常见的bug源…为什么它能工作是一个谜,但不知道什么是
x
。什么是enumerate(),我如何找到它?
enumerate()
是一种在索引的同时在iterables上循环的方法。我建议您查看一些示例。如果您对此感到厌烦,我们可以将枚举中的i的
替换为范围内的i的
;它们在功能上是等价的。
01120190637
01007332209