2017-04-11 145 views
0
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] != '-' or 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 

print('444-444-4444 is a phone number: ') 
print(isPhoneNumber('473-927-2847')) 
print('Moshi moshi is a phone number:') 
print(isPhoneNumber('Moshi moshi')) 
print('8478473948 is a phone number:') 
print(isPhoneNumber('847847-3948')) 

現在他們都返回false。怎麼來的?爲什麼第三個「if」語句沒有返回適當的值?它應該對第一個函數調用和第三個函數調用都返回true。我將如何去做這個工作?檢查數字0到7之間的非空格,並檢查連字符,如果未找到,則返回false。未返回預期結果python

+0

縮進似乎關閉了錯誤的空間? –

回答

2

text[3]始終評估爲某事,所以表達式text[3] != ''總是評估爲True

因此,第三條if語句總是運行return False語句。

刪除該部分(使您的if語句if text[3] != '-':)使您的程序在第一個測試用例中正常工作。

此外,它看起來像你試圖讓破折號可選 - 這將打破你的硬編碼索引的其餘功能,所以你需要一個if塊。

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

通則說明:喜歡的東西,對於這種使用情況,考慮使用regular expressions,這將讓你指定的電話號碼的格式沒有這一切的字符串索引。

正則表達式\d{3}-?\d{3}-\d{3}在這種情況下工作。

+0

好吧是的,這是真的我現在得到它。 – user3567030

2
if text[3] != '-' or text[3] != '': 

其中的一個兩個條件必須真,所以你回來不管輸入的。我想你想要一個那裏,以及在第二個條件(這是真正的任何輸入你給)的字符。

+0

但即使當我添加'或不是文本[3] .isdecimal返回False'它仍然不會返回預期值。 – user3567030

+0

@ user3567030試試我的答案,我添加了一些代碼,使它可以用於第三個測試用例 – APerson

1

我認爲您所尋找的解決方案似乎比一個提議的解決方案更普遍。當然,如果這看起來太長了,只要看看底部的解決方案,並根據需要返回,但我希望能有所幫助。

所以,有幾個問題:

首先,按照我的理解(希望我是對的,否則其他的答案是完美的),它看起來像有你想要的字符串的一些基本類別接受:

  1. 全連字符的電話號碼類似東西'444-4747635' O複合斷字'444-444-4444'
  2. 非連電話號碼一樣'4444444444'
  3. 電話號碼r '847847-3948'從你上面的例子。

不幸的是只有完全連接的品種有12個字符。

因此,行if len(text) != 12:將立即導致具有混合連字符或無連字符的潛在電話號碼被拒絕。

取而代之的是,與您的風格保持一致,請嘗試if len(text) < 10 or len(text) > 12:。這消除了所有太短或太短的字符串。

另一個問題,如其他答案中所述,源於您總是使用True檢查:if text[3] != '-' or text[3] != ''。第二個 表達式text[3] != ''將始終具有值True,這意味着 函數只能返回False

也許這種方法的基本原理包括相信檢查特定索引處的字符是''可能允許將字符串的其餘部分視爲字符是一個索引,也許還像是檢查沒有其他不需要的人物在那裏。這些都是我非常推測的想法,但無論哪種方式,它們似乎都是合理的,但不起作用。

要以類似於原始版本的方式進行操作,使用變量遍歷字符串可能比使用文字更有用,因爲就我們以哪種方式調查哪些索引而言,我們可以具有更大的靈活性。一個變量,稱爲i,可以指向你在字符串中的位置,而另一個變量,如j,可以指向你需要停下來做另一種檢查的地方。

我包含了一個完整的(我認爲)靈活的函數版本,它大部分都是用你想到的相同方法和風格構建的。我相信這個版本允許既不存在連字符也不存在的情況,以及僅當第二個缺失的情況下,我不相信上述APerson的解決方案(或許是正確的)。

如果您確實希望更靈活的版本,這裏是一個可能的實現:

def isPhoneNumber(text): 
    i = 0 
    j = 0 
    if len(text) < 10 or len(text) > 12: 
     return False 
    while i < 3: 
     if not text[i].isdecimal(): 
     return False 
     i += 1 
    if text[i] == '-': 
     i += 1 
    j = i + 3 
    while i < j: 
     if not text[i].isdecimal(): 
     return False 
     i += 1 
    if text[i] == '-': 
     i += 1 
    j = len(text)   # or j = i + 4 for consistency 
    while i < j: 
     if not text[i].isdecimal(): 
     return False 
     i += 1 
    return True 

當然,作爲APerson提到,regular expressions是一個更簡潔的方式來解決這樣的模式匹配問題。 (他們會使用諸如括號或空格之類的東西來處理更一般的電話號碼空間。

如果APerson對電話號碼空間的解釋是正確的,那麼應該首選 答案。但是,如果我是正確的,那麼正則表達式 \d{3}-?\d{3}-?\d{3}將是正確的。