将单数法语名词改为复数的函数不能正常工作(正则表达式)

时间:2017-11-15 13:35:54

标签: python regex

我正在阅读"潜入Python"在第6章中,作者使用正则表达式定义了一个函数,该函数将单数英语名词改为复数名词。 这是:

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'

我决定编写一个将单个法语名词改为复数的函数。这就是它的样子:

def plural(noun):
    if re.search('[sxz]$', noun):
        return re.sub('$', '', noun)
    elif re.search(r'''au$|al$|ail$|
                [^\bbijou\b| # exceptions
                \bcaillou\b|
                \bchou\b|
                \bgenou\b|
                \bhibou\b|
                \bjoujou\b|
                \bpou\b]''', noun, re.VERBOSE):
        return re.sub('au$|al$|ail$', 'aux', noun)
    elif re.search(r'''\bbijou\b|
                   \bcaillou\b|
                   \bchou\b|
                   \bgenou\b|
                   \bhibou\b|
                   \bjoujou\b|
                   \bpou\b''', noun, re.VERBOSE):
        return re.sub('ou$', 'oux', noun)
    elif re.search('eu$', noun):
        return re.sub('$', 'eux', noun)
    elif re.search('eau$', noun):
        return re.sub('$', 'eaux', noun)
    elif re.search('ou$', noun):
        return re.sub('ou$', 'ous', noun)
    else:
        return noun + 's'

它在大多数情况下都有效,但是!由于某种原因,如果一个名词(例如:fleur)只需要添加" s" (" else"声明),它不起作用......它只是返回' fleur'但是应该返回' fleurs'。 我在可视化工具中运行代码,这就是问题所在:

      elif re.search(r'''au$|al$|ail$|
            [^\bbijou\b|  
            \bcaillou\b|
            \bchou\b|
            \bgenou\b|
            \bhibou\b|
            \bjoujou\b|
            \bpou\b]''', noun, re.VERBOSE):

当我删除" [^ \ bbijou \ b |                 \ bcaillou \ C |                 \ bchou \ C |                 \ bgenou \ C |                 \ bhibou \ C |                 \ bjoujou \ C |                 \ bpou \ B]"那么"否则"部分工作。我只是想了解问题到底是什么以及如何解决它。

1 个答案:

答案 0 :(得分:0)

^\bbijou\b

仅表示:^\b(反斜杠),b i j o或{{1}不匹配的任何内容}}

因此匹配u leur。

你的意思是:f