gwoyeu.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3. import re
  4. from pypinyin.constants import Style
  5. from pypinyin.style import register
  6. from pypinyin.style._constants import RE_TONE3
  7. from pypinyin.style._utils import replace_symbol_to_number
  8. GWOYEU_REPLACE = (
  9. (re.compile(r'^r5$'), 'er5'),
  10. (re.compile(r'iu'), 'iou'),
  11. (re.compile(r'ao'), 'au'),
  12. (re.compile(r'^yi?'), 'i'),
  13. (re.compile(r'^wu?'), 'u'),
  14. (re.compile(r'^([jqx])u'), '\\1iu'),
  15. (re.compile(r'(?<![iy])u([in])'), 'ue\\1'),
  16. (re.compile(r'v'), 'iu'),
  17. (re.compile(r'^([zcsr]h?)i'), '\\1y'),
  18. (re.compile(r'^zh'), 'j'),
  19. (re.compile(r'^z'), 'tz'),
  20. (re.compile(r'^c(?!h)'), 'ts'),
  21. (re.compile(r'^q'), 'ch'),
  22. (re.compile(r'^x'), 'sh'),
  23. (re.compile(r'er'), 'el'),
  24. (re.compile(r'5$'), ''),
  25. (re.compile(r'0$'), 'q'),
  26. (re.compile(r'^i(.*[34])$'), 'yi\\1'),
  27. (re.compile(r'^u(.*[34])$'), 'wu\\1'),
  28. (re.compile(r'^yi([aeu].*4)$'), 'y\\1'),
  29. (re.compile(r'^wu([ae].*4)$'), 'w\\1'),
  30. )
  31. TONE_REPLACE = (
  32. (re.compile(r'^([lmnr])(.+)1$'), '\\1h\\2'),
  33. (re.compile(r'1$'), ''),
  34. (re.compile(r'^([lmnr])(.+)2$'), '\\1\\2'),
  35. (re.compile(r'^([^ae]*)i(ng?)*2$'), '\\1yi\\2'),
  36. (re.compile(r'^([^ao]*)u2$'), '\\1wu'),
  37. (re.compile(r'^([^ae]*)i(.+)2$'), '\\1y\\2'),
  38. (re.compile(r'^([^ao]*)u(.+)2$'), '\\1w\\2'),
  39. (re.compile(r'([aeiouy]+)(.*)2$'), '\\1r\\2'),
  40. (re.compile(r'^([^aeiou]*)([iu])(ng?)?3$'), '\\1\\2\\2\\3'),
  41. (re.compile(r'^([^eu]*)i(.*)3$'), '\\1e\\2'),
  42. (re.compile(r'^(.*)u(.*)3$'), '\\1o\\2'),
  43. (re.compile(r'([aeiouy])(.*)3$'), '\\1\\1\\2'),
  44. (re.compile(r'^([^ae]*)i4$'), '\\1ih'),
  45. (re.compile(r'^([^ao]*)u4$'), '\\1uh'),
  46. (re.compile(r'i4$'), 'y'),
  47. (re.compile(r'u4$'), 'w'),
  48. (re.compile(r'l4$'), 'll'),
  49. (re.compile(r'ng4$'), 'nq'),
  50. (re.compile(r'n4$'), 'nn'),
  51. (re.compile(r'4$'), 'h'),
  52. )
  53. class GwoyeuConverter(object):
  54. def _pre_convert(self, pinyin):
  55. # 用数字表示声调
  56. pinyin = replace_symbol_to_number(pinyin)
  57. # 将声调数字移动到最后
  58. return RE_TONE3.sub(r'\1\3\2', pinyin)
  59. def to_gwoyeu(self, pinyin, **kwargs):
  60. pinyin = self._pre_convert(pinyin)
  61. for find_re, replace in GWOYEU_REPLACE:
  62. pinyin = find_re.sub(replace, pinyin)
  63. for find_re, replace in TONE_REPLACE:
  64. if find_re.search(pinyin):
  65. return find_re.sub(replace, pinyin)
  66. return pinyin
  67. converter = GwoyeuConverter()
  68. register(Style.GWOYEU, func=converter.to_gwoyeu)