您在这里:首页 > 深入 Python > 动态函数 > plural.py,阶段 1 | << >> | ||||
深入 Python从 Python 新手到专家 |
您正在查看单词,至少在英语中,单词是由字符组成的字符串。您有一些规则,要求您找到不同的字符组合,然后对它们进行不同的处理。这听起来像是正则表达式的工作。
import re def plural(noun): if re.search('[sxz]$', noun):return re.sub('$', 'es', noun)
elif re.search('[^aeioudgkprt]h$', noun): return re.sub('$', 'es', noun) elif re.search('[^aeiou]y$', noun): return re.sub('y$', 'ies', noun) else: return noun + 's'
![]() |
好的,这是一个正则表达式,但它使用了一种您在第 7 章“正则表达式”中没有见过的语法。方括号表示“匹配这些字符中的一个”。所以[sxz]表示“s、x或z”,但只能是其中之一。$应该很熟悉;它匹配字符串的结尾。所以您正在检查noun是否以s、x或z结尾。 |
![]() |
这个re.sub函数执行基于正则表达式的字符串替换。让我们更详细地看一下。 |
>>> import re >>> re.search('[abc]', 'Mark')<_sre.SRE_Match object at 0x001C1FA8> >>> re.sub('[abc]', 'o', 'Mark')
'Mork' >>> re.sub('[abc]', 'o', 'rock')
'rook' >>> re.sub('[abc]', 'o', 'caps')
'oops'
import re def plural(noun): if re.search('[sxz]$', noun): return re.sub('$', 'es', noun)elif re.search('[^aeioudgkprt]h$', noun):
return re.sub('$', 'es', noun)
elif re.search('[^aeiou]y$', noun): return re.sub('y$', 'ies', noun) else: return noun + 's'
>>> import re >>> re.search('[^aeiou]y$', 'vacancy')<_sre.SRE_Match object at 0x001C1FA8> >>> re.search('[^aeiou]y$', 'boy')
>>> >>> re.search('[^aeiou]y$', 'day') >>> >>> re.search('[^aeiou]y$', 'pita')
>>>
>>> re.sub('y$', 'ies', 'vacancy')'vacancies' >>> re.sub('y$', 'ies', 'agency') 'agencies' >>> re.sub('([^aeiou])y$', r'\1ies', 'vacancy')
'vacancies'
![]() |
这个正则表达式将vacancy转换为vacancies,将agency转换为agencies,这正是您想要的。请注意,它也会将boy转换为boies,但这在函数中永远不会发生,因为您首先执行了re.search来确定是否应该执行此re.sub。 |
![]() |
顺便说一句,我想指出的是,可以将这两个正则表达式(一个用于确定规则是否适用,另一个用于实际应用规则)组合成一个正则表达式。它看起来像这样。大部分内容应该很熟悉:您正在使用一个记忆组,您在第 7.6 节“案例研究:解析电话号码”中学习过,用于记住y之前的字符。然后在替换字符串中,您使用一个新的语法\1,这意味着“嘿,您还记得第一个组吗?把它放在这里”。在这种情况下,您记住了y之前的c,然后在进行替换时,您用c替换c,用ies替换y。(如果您有多个记忆组,则可以使用\2、\3等)。 |
正则表达式替换功能非常强大,\1语法使其更加强大。但是,将整个操作组合成一个正则表达式也更难阅读,并且它没有直接映射到您最初描述复数规则的方式。您最初制定的规则类似于“如果单词以 S、X 或 Z 结尾,则添加 ES”。如果您查看此函数,您会发现有两行代码表示“如果单词以 S、X 或 Z 结尾,则添加 ES”。没有比这更直接的了。
<< 动态函数 |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
plural.py,阶段 2 >> |