Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 27 additions & 1 deletion pypinyin/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,12 @@ def initial(pinyin):
return i
return ''

U_FINALS_EXCEPTIONS_MAP = {
u'ū': u'ǖ',
u'ú': u'ǘ',
u'ǔ': u'ǚ',
u'ù': u'ǜ',
}

def final(pinyin):
"""获取单个拼音中的韵母.
Expand All @@ -207,9 +213,29 @@ def final(pinyin):
"""
initial_ = initial(pinyin) or None
if not initial_:
return pinyin
return no_initial_final(pinyin)
# 特例 j/q/x
m = re.match(u'^(j|q|x)(ū|ú|ǔ|ù)$', pinyin)
if m:
return (U_FINALS_EXCEPTIONS_MAP[m.group(2)])
pinyin = re.sub('^(j|q|x)u(\d?)$', r'\1v\2', pinyin)
return ''.join(pinyin.split(initial_, 1))

def no_initial_final(pinyin):
# 特例 y/w
if pinyin.startswith('y'):
if pinyin.startswith('yu'):
pinyin = 'v' + pinyin[2:]
elif pinyin.startswith('yi'):
pinyin = pinyin[1:]
else:
pinyin = 'i' + pinyin[1:]
if pinyin.startswith('w'):
if pinyin.startswith('wu'):
pinyin = pinyin[1:]
else:
pinyin = 'u' + pinyin[1:]
return pinyin

def toFixed(pinyin, style):
"""根据拼音风格格式化带声调的拼音.
Expand Down
27 changes: 23 additions & 4 deletions tests/test_pinyin.py
Original file line number Diff line number Diff line change
Expand Up @@ -222,14 +222,33 @@ def test_simple_seg():
],
# 误把 yu 放到声母列表了
['鱼', {'style': TONE2}, ['yu2']],
['鱼', {'style': FINALS}, ['yu']],
['鱼', {'style': FINALS}, ['v']],
['雨', {'style': TONE2}, ['yu3']],
['雨', {'style': FINALS}, ['yu']],
['雨', {'style': FINALS}, ['v']],
['元', {'style': TONE2}, ['yua2n']],
['元', {'style': FINALS}, ['yuan']],
# y, w 也不是拼音
['元', {'style': FINALS}, ['van']],
# y, w 也不是拼音, yu的韵母是v, yi的韵母是i, wu的韵母是u
['呀', {'style': INITIALS}, ['']],
['呀', {'style': TONE2}, ['ya1']],
['呀', {'style': FINALS}, ['ia']],
['无', {'style': INITIALS}, ['']],
['无', {'style': TONE2}, ['wu2']],
['无', {'style': FINALS}, ['u']],
['衣', {'style': TONE2}, ['yi1']],
['衣', {'style': FINALS}, ['i']],
['万', {'style': TONE2}, ['wa4n']],
['万', {'style': FINALS}, ['uan']],
# ju, qu, xu 的韵母应该是 v
['具', {'style': FINALS_TONE}, ['ǜ']],
['具', {'style': FINALS_TONE2}, ['v4']],
['具', {'style': FINALS}, ['v']],
['取', {'style': FINALS_TONE}, ['ǚ']],
['取', {'style': FINALS_TONE2}, ['v3']],
['取', {'style': FINALS}, ['v']],
['徐', {'style': FINALS_TONE}, ['ǘ']],
['徐', {'style': FINALS_TONE2}, ['v2']],
['徐', {'style': FINALS}, ['v']],

]


Expand Down