HOME | Python | download | 書き込む |
以下 (kana.py) に示すように、意外と簡潔に書くことができます。 説明と、テストコードを除いた本体は 47 行で済みます。
#!python #coding:utf8 import kana def pprint(*ls): print(*ls, sep='\n', end='\n\n') if __name__=='__main__': for s in ['てんはひとのうえにひとをつくらずひとのしたにひとをつくらず', \ 'ほんじつはせいてんなれどもなみたかし', \ 'わがはいはねこである', \ ]: pprint(s, kana.jz(s), kana.jh(s)) for s in ['テンハヒトノウエニヒトヲツクラズヒトノシタニヒトヲツクラズ', \ 'ホンジツハセイテンナレドモナミタカシ', \ 'ワガハイハネコデアル', \ ]: pprint(s, kana.zh(s), kana.zj(s)) for s in ['テンハヒトノウエニヒトヲツクラズヒトノシタニヒトヲツクラズ', \ 'ホンジツハセイテンナレドモナミタカシ', \ 'ワガハイハネコデアル', \ ]: pprint(s, kana.hz(s), kana.hj(s))実行結果
Z:\doc\monthly\12-11\kana>d:\python32\python.exe test_kana.py てんはひとのうえにひとをつくらずひとのしたにひとをつくらず テンハヒトノウエニヒトヲツクラズヒトノシタニヒトヲツクラズ テンハヒトノウエニヒトヲツクラズヒトノシタニヒトヲツクラズ ほんじつはせいてんなれどもなみたかし ホンジツハセイテンナレドモナミタカシ ホンジツハセイテンナレドモナミタカシ わがはいはねこである ワガハイハネコデアル ワガハイハネコデアル テンハヒトノウエニヒトヲツクラズヒトノシタニヒトヲツクラズ テンハヒトノウエニヒトヲツクラズヒトノシタニヒトヲツクラズ てんはひとのうえにひとをつくらずひとのしたにひとをつくらず ホンジツハセイテンナレドモナミタカシ ホンジツハセイテンナレドモナミタカシ ほんじつはせいてんなれどもなみたかし ワガハイハネコデアル ワガハイハネコデアル わがはいはねこである テンハヒトノウエニヒトヲツクラズヒトノシタニヒトヲツクラズ テンハヒトノウエニヒトヲツクラズヒトノシタニヒトヲツクラズ てんはひとのうえにひとをつくらずひとのしたにひとをつくらず ホンジツハセイテンナレドモナミタカシ ホンジツハセイテンナレドモナミタカシ ほんじつはせいてんなれどもなみたかし ワガハイハネコデアル ワガハイハネコデアル わがはいはねこである
変換テーブルを作成するのに、str.maketrans(x [,y [,z]]) を使います。 str.maketrans() の引数には文字をキーとする辞書、あるいは、等しい長さの2つの文字列を渡すことができます。 辞書を渡す場合、キーは文字である必要がありますが、値は文字列でよいので、1文字を文字列に変換することができます。 そのため全角の濁音 (例えば「ガ」や「が」) を半角の濁音 (「ガ」)に変換することができます。 文字列を引数に渡す場合、1番目の文字列を2番目の文字列に変換する変換テーブルを返します。また、 3番目の引数は変換後の文字列には含めない文字の文字列を渡します。 str.maketrans() についての詳しい説明は、 python のドキュメント を見てください。
001: #!python3 002: #coding:utf8 003: 004: """ 005: かな変換ライブラリ 006: 007: 変換関数: 008: zj(s): s に含まれる 全角カタカナをひらがなに変換 009: jz(s): s に含まれる ひらがなを全角カタカナに変換 010: zh(s): s に含まれる 全角カタカナを半角カタカナに変換 011: jh(s): s に含まれる ひらがなを半角カタカナに変換 012: hz(s): s に含まれる 半角カタカナを全角カタカナに変換 013: hj(s): s に含まれる 半角カタカナをひらがなに変換 014: 015: ノート 016: str.translate メソッドをつかって変換。 017: それに加えて以下の操作を行う 018: 019: 半角カタカナから変換する場合: 020: 半角カタカナの濁音は2文字で表されるので、それらを正規表現を用いて制御文字1文字 (€ -- ) 021: におきかえてから translate を用いて全角の濁音に置き換える。 022: 023: 平仮名から変換する場合: 024: う゛を ヴ に置き換えてから translate で変換する。 025: 026: 平仮名に変換する場合 027: translate の結果の ヴ を う゛に置き換える。 028: """ 029: 030: import re, functools 031: 032: C_OFF = 0x80 033: 034: S_HIR = '、。「」 ー0123456789' \ 035: 'あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん' \ 036: 'っぁぃぅぇぉゃゅょ' \ 037: 'がぎぐげござじずぜぞだぢづでどばびぶべぼヴ' \ 038: 'ぱぴぷぺぽ' \ 039: 040: S_ZEN = '、。「」 ー0123456789' \ 041: 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン' \ 042: 'ッァィゥェォャュョ' \ 043: 'ガギグゲゴザジズゼゾダヂヅデドバビブベボヴ' \ 044: 'パピプペポ' 045: 046: S_SEI = '、。「」 -0123456789' \ 047: 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン' \ 048: 'ッァィゥェォャュョ' 049: S_DAK ='カキクケコサシスセソタチツテトハヒフヘホウ' 050: S_HAT ='ハヒフヘホ' 051: TENN, MARU = '゙', '゚' 052: 053: L_DAK = [c+TENN for c in S_DAK] + [c+MARU for c in S_HAT] 054: S_CCH = ''.join(chr(i+C_OFF) for i in range(len(L_DAK))) 055: S_HAN = S_SEI + S_CCH 056: L_HAN = list(S_SEI) + L_DAK 057: H_DAK = dict(zip(L_DAK, S_CCH)) 058: R_DAK = re.compile('[{}]{}|[{}]{}'.format(S_DAK, TENN, S_HAT, MARU)) 059: 060: def comb(*fs): 061: return lambda x: functools.reduce(lambda y,f:f(y), fs, x) 062: 063: def trans(k,v): 064: assert len(k)==len(v) 065: tbl = str.maketrans(k,v) if type(v) is str else \ 066: str.maketrans(dict(zip(k,v))) 067: return lambda s: s.translate(tbl) 068: 069: def replace(c0, c1): return lambda s: s.replace(c0,c1) 070: subd = lambda s: R_DAK.sub(lambda m:H_DAK[m.group()], s) 071: 072: zj=comb(trans(S_ZEN, S_HIR), replace('ヴ', 'う゛')) 073: jz=comb(replace('う゛', 'ヴ'), trans(S_HIR, S_ZEN)) 074: zh=trans(S_ZEN, L_HAN) 075: jh=comb(replace('う゛', 'ヴ'), trans(S_HIR, L_HAN)) 076: hz=comb(subd, trans(S_HAN, S_ZEN)) 077: hj=comb(subd, trans(S_HAN, S_HIR), replace('ヴ', 'う゛')) 078: 079: 080: def test(name, fun, s): 081: print(name, 'ok' if s==fun(s) else 'ng', sep=' .... ') 082: 083: if __name__=='__main__': 084: test('zen>han>zen', comb(zh, hz), S_ZEN) 085: test('zen>hira>zen', comb(zj, jz), S_ZEN) 086: 087: s_hir = S_HIR.replace('ヴ', 'う゛') 088: test('hira>zen>hira', comb(jz, zj), s_hir) 089: test('hira>han>hira', comb(jh, hj), s_hir) 090: 091: s_han=''.join(L_HAN) 092: test('han>hira>han', comb(hj, jh), s_han) 093: test('han>zen>han', comb(hz, zh), s_han)
HOME | Python | download | 書き込む |