Я пытаюсь токенизировать китайскую нотацию пиньинь (без тонов).Рассмотрим следующий код:
finals = ['a',
'o',
'e',
'ai',
'ei',
'ao',
'ou',
'an',
'ang',
'en',
'eng',
'er',
'u',
'ua',
'uo',
'uai',
'ui',
'uan',
'uang',
'un',
'ueng',
'ong',
'i',
'i',
'ia',
'ie',
'iao',
'iu',
'ian',
'iang',
'in',
'ing',
'ü',
'üe',
'üan',
'ün',
'iong']
initials = ['p',
'm',
'f',
'd',
't',
'n',
'l',
'g',
'k',
'h',
'j',
'q',
'x',
'z',
'h',
'c',
'h',
's',
'h',
'r',
'z',
'c',
's']
others = ['a',
'o',
'e',
'ai',
'ei',
'ao',
'ou',
'an',
'ang',
'en',
'eng',
'er',
'wu',
'wa',
'wo',
'wai',
'wei',
'wan',
'wang',
'wen',
'weng',
'yi',
'ya',
'ye',
'yao',
'you',
'yan',
'yang',
'yin',
'ying',
'yu',
'yue',
'yuan',
'yun',
'yong']
r = '^((%s)(%s)|%s)+$' % ('|'.join(initials), '|'.join(finals), '|'.join(others))
import re
m = re.match(r, 'yinwei')
print(m.groups())
Я надеялся получить ['yin','wei']
(две последовательные внешние группы), но по какой-то причине получил только «wei».Почему этот код не работает и как это исправить?Я также попробовал следующее, но оно случайно либо дает мне ['yin', 'wei']
или ['yi', 'wei]
:
import regex
r = '|'.join({i + f for i in initials for f in finals}.union(set(others)))
print(regex.findall(r, 'yinwei'))
РЕДАКТИРОВАТЬ: я собирался принять это как дубликат 4963691 из-заответ эхумуро, но он не работает с bangongshi
в качестве ввода - вместо ['ban','gong','shi']
мы получаем ['bang', 'o', 'shi']
.В связи с этим я хотел бы, чтобы этот вопрос рассматривался отдельно от этого .