我正在编写一个程序,该程序检查字符串以确保它是有效的电话号码(例如415-555-1011)
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 text[i].isdecimal():
return False
if text[7]!='-':
return False
for i in range(8,12):
if not text[i].decimal():
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')
我应该得到以下输出
Phone number found: 415-555-1011
Phone number found: 415-555-9999
Done
但是我只能得到
Done
我没有得到前两行
答案 0 :(得分:1)
您在第二个循环中缺少not
:
for i in range(4,7):
if text[i].isdecimal():
return False
在上一个循环中,您使用text[i].decimal()
而不是text[i].isdecimal()
。
如果其中任何一个字符是数字,则返回False
。您想使用:
for i in range(4,7):
if not text[i].isdecimal():
return False
您还需要在每个这些数字循环中的每次迭代的下一个位置测试破折号(您只需要在这些循环之后测试 ),然后在{末端也需要移出该循环(您只需测试位置8处的数字)即可。
您不需要测试每个单独的角色;您可以只用一片:
return True
您可以使用正则表达式简化所有操作:
def isPhoneNumber(text):
if len(text) != 12:
return False
if not text[:3].isdecimal():
return False
if text[3] != '-':
return False
if not text[4:7].isdecimal():
return False
if text[7] != '-':
return False
if not text[8:12].isdecimal():
return False
return True
请注意,此模式实际上禁止电话号码成为更长的号码集的一部分(您的代码会在import re
phone_numbers = re.compile(r'\b\d{3}-\d{3}-\d{4}\b')
for number in phone_numbers.findall(message):
print('Phone number found:', number)
中找到电话号码;所需要的只是一个中间的3位数字,中间用破折号和3位数字前缀和4位数字后缀)。 0014213012345-444-123244214324
模式要求匹配的电话号码前后必须有非单词字符(字母,数字或下划线除外)。
答案 1 :(得分:0)
嗨,您可以尝试以下逻辑:-
def msg_phone():
message = 'Call me at 415-555-1011 tomorrow. 415-555-9999 is my office.'
number=re.findall('[0-9]{3}-[0-9]{3}-[0-9]{4}',message)
for i in number:
print('Phone number found:',i)
print('Done')
代码长度少得多,复杂度也小。