2013-12-08 43 views
2

我目前正在學習使用Dive Into Python 3書籍(以及其他)編程Python。下面是本書第5章中的例子,展示了使用列表函數以便將詞語多元化。Python:返回語句的問題

import re 

def match_sxz(noun): 
    return re.search('[sxz]$', noun) 

def apply_sxz(noun): 
    return re.sub('$', 'es', noun) 

def match_h(noun): 
    return re.search('[^aeioudgkprt]h$', noun) 

def apply_h(noun): 
    return re.sub('$', 'es', noun) 

def match_y(noun): 
    return re.sub('y$', 'ies', noun) 

def apply_y(noun): 
    return re.sub('y$', 'ies', noun) 

def match_default(noun): 
    return True 

def apply_default(noun): 
    return noun + 's' 

rules = ((match_sxz, apply_sxz), 
     (match_h, apply_h), 
     (match_y, apply_y), 
     (match_default, apply_default) 
     ) 

def plural(noun): 
     for (matches_rule, apply_rule) in rules: 
      if matches_rule(noun): 
       return apply_rule(noun) 

的問題是,當我試圖在IDLE執行代碼我不得到像「學生」(詞有簡單的複數形式,最後一條規則)的話正確的結果。遵守其他規則的單詞沒有問題。

這裏是我所得到的形成解釋:

>>> import plural 
>>> plural.plural('copy') 
'copies' 
>>> plural.plural('hoax') 
'hoaxes' 
>>> plural.plural('beach') 
'beaches' 
>>> plural.plural('student') 
'student' 

的真的很奇怪的事情是,當我致電apply_default()函數從翻譯任務完成!

>>> plural.apply_default('student') 
'students' 
+1

您的源代碼中存在拼寫錯誤:'match_y'使用're.sub'而不是're.search' – Keeper

+1

您確定您正在IDLE中運行最新版本的代碼嗎?我的猜測是,在更改之後,您沒有重新加載代碼 – shx2

回答

0

match_y功能失常:

def match_y(noun): 
    # return re.sub('y$', 'ies', noun) # NO! 
    return re.search('y$', noun) 

它總是會返回一個非空字符串,當作爲一個布爾值測試,其對作爲True;所以你應用了apply_y規則,該規則什麼也沒做,因爲你的單詞沒有-y,並返回結果(即原始單詞)。

+0

已修復。刷新的眼睛總是有幫助的。謝謝 – Sorrop

0

在您的代碼中,match_y將始終評估爲True。另外,看看應用re.sub的文檔:

re.sub(pattern, repl, string, count=0, flags=0)

Return the string obtained by replacing the leftmost non-overlapping occurrences of pattern in string by the replacement 

REPL。如果未找到該模式,則字符串將保持不變。 repl 可以是字符串或函數;如果它是一個字符串,則會對其中的任何反斜槓 進行處理。也就是\ n被轉換爲一個 換行符,\ r被轉換爲回車符,等等。 像\ j這樣的未知的轉義字符保留。反向引用(例如\ 6, )被替換爲模式中由組6匹配的子字符串。

來源: http://docs.python.org/2/library/re.html