|
例 17.10. plural4.py 继续
patterns = \
(
('[sxz]$', '$', 'es'),
('[^aeioudgkprt]h$', '$', 'es'),
('(qu|[^aeiou])y$', 'y$', 'ies'),
('$', '$', 's')
)
rules = map(buildMatchAndApplyFunctions, patterns)
我们的复数化规则现在被定义成一组字符串(不是函数)。 第一个字符串是你在调用 re.search 时使用的正则表达式;第二个和第三个字符串是你在通过调用 re.sub 来应用规则将名词变为复数时使用的搜索和替换表达式。
这很神奇。 把传进去的 patterns 字符串转换为传回来的函数。 如何做到的呢? 将这些字符串映射给 buildMatchAndApplyFunctions 函数之后,三个字符串参数转换成了两个函数组成的元组。 这意味着 rules 被转换成了前面范例中相同的内容:由许多调用 re.search 函数的匹配函数和调用 re.sub 的规则应用函数构成的函数组组成的一个元组。
我发誓这不是我信口雌黄:rules 被转换成了前面范例中相同的内容。 剖析 rules 的定义,你看到的是:
例 17.11. 剖析规则定义
rules = \
(
(
lambda word: re.search('[sxz]$', word),
lambda word: re.sub('$', 'es', word)
),
(
lambda word: re.search('[^aeioudgkprt]h$', word),
lambda word: re.sub('$', 'es', word)
),
(
lambda word: re.search('[^aeiou]y$', word),
lambda word: re.sub('y$', 'ies', word)
),
(
lambda word: re.search('$', word),
lambda word: re.sub('$', 's', word)
)
) |
|