我目前正在学习使用Dive Into Python 3(以及其他)编写Python程序。下面是本书第5章中的示例,演示了列表函数的使用,以便复数词。
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中执行代码时,我没有得到像“student”这样的单词的正确结果(具有简单复数形式的单词 - 最后一条规则)。其他规则下的单词没有问题。
以下是我从口译员那里得到的内容:
>>> 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'
答案 0 :(得分: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 \ n将转换为回车符,依此类推。 诸如\ j之类的未知转义单独留下。反向引用,例如\ 6, 被替换为模式中由组6匹配的子字符串。
答案 1 :(得分:0)
您的match_y
功能错误:
def match_y(noun):
# return re.sub('y$', 'ies', noun) # NO!
return re.search('y$', noun)
它总是返回一个非空字符串,当作为布尔值测试时,它被计为True
;所以你应用了apply_y
规则,因为你的单词上没有-y而没有做任何规则,并且返回了结果(即原始单词)。