2012年01月29日

文書内の全数字を算用数字表現: all2int(), str2int()

 文字列の汎用置替えでは画一的なパターンで画一的に処理する為、必ずしも全てが妥当な置替え結果を得れるものではない。このことは、例えば文書中の数字表記で考えて頂ければ判りやすいだろう。
 「領収額 金壱億弐百参万円也」「面積 百弐拾参・四五坪」通常縦書きの契約書類等で用いられる表記方法である。漢数字も大字と言う改竄防止の画数の多い文字が使われている点は単純にdai2num()でも「領収額 金1億2百3万円也」「面積 百2拾3・45坪」の様に置替えて読み易くすること迄は出来る。
 しかし、これら全てを算用数字に一発で置替えようとすると億、万、百、拾と言う位を表す文字の扱いが問題になる。言わばint(u'1億2百3万')で102030000と言う整数値が生成出来る様にする必要が出て来る。それに応えるものが、今回説明するmire.jcode.str2int()関数である。それに前稿のreplaces()関数を絡めれば、「領収額 金102030000円也」「面積 123・45坪」の様に算用数字表記の整数に置替えることが出来る。

 先ずはmire.jcode.str2int()関数のコードは次の通りだ。仕様は標準のint()同様、数字以外の文字を含むと期待する以外の結果を生む可能性がある仕様としている。また例えば百円とか千円と言うと日本では100円とか1000円の意味であり壱が省略されたものとして対処する仕様としている。
続きを読む
posted by Mire at 19:39 | Comment(0) | TrackBack(0) | Pythonプログラミング | このブログの読者になる | 更新情報をチェックする

辞書指定で複数置替え可能なreplaces()文字列置替関数

 Pythonには文字列メソッドreplace()がある。これはとても便利で1つ2つの置換文字列の指定程度なら何の問題もない。しかし、文字列メソッドreplace()には同時に置替部分文字列を一組しか指定出来ないので置替対象の部分文字列の数が多くなると、その回数分文字列を舐め回すことになり効率が悪い。複数の置替部分文字列の組合せを辞書で一括指定し文字列の先頭から一度のスキャンでreplace出来れば有用である。
 実際、この機能は前稿の中核関数であるzen_conv()に基本機能を内蔵しているので、以下の様に引数を調整するだけで作れてしまう。



def replaces(s, alt_dic={}, pass_list=[], mode='None', del_list=[], my_dic={}
, yen=u'¥', debug=0):
"""
複数の文字列の置替ペアの辞書指定して、文字列s上の合致部分を置替た文字列を返す関数
replaces( s : 標準関数replace(s, old, new)の様な文字列sの置替関数
, alt_dic : 上記のreplace()のoldをnewの対を辞書に指定(複数)
, pass_list : 変換しない領域の文字列をリスト内に指定
, mode=None : 必要により、z_conv()のmodeで置替辞書を指定
, del_list=[]: 置替辞書から除去する文字をlistで指定
, my_dic={} : 固有の置替辞書を指定
, yen=u'¥' : 「\」を「¥」(既定値)以外で置替えたい文字列を指定
, debug=0 ): 0:何もしない(既定値), 1以上:debugの為の情報表示あり
"""
return zen_conv(s, mode=mode, alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)
 文字列メソッドreplace()との大きな差は関数という仕様の為、第一引数に文字列オブジェクトを指定することになること以外は、count引数がないことくらいだ。後はzen_conv()関数の残りの引数を既定値で埋めただけの仕様なので、必要により半角と全角の置替えも一度で処理出来る。実用例は次稿の関数all2int内で利用しているのでここでは割愛させて頂くが、前稿の/usr/lib/python2.6/site-packages/mire/jpcode.pyをInstallして頂き次の様にする。



from mire.jpcode import replaces
test_str = u'テスト文字列...'
print replaces(test_str, {u'置き換え':u'置換え', u'デフォルト値':u'既定値'})
 もし、半角カナを全角カナに同時に変更するなら、引数mode='han2kata'を追加指定するば同時に処理することが出来る。内部処理としては、辞書はhan2kataに追加され、テスト文字列を一文字ずつ読込み、その文字と頭文字が一致する辞書の要素がある場合に、その最大文字数の要素から全一致するものを探し、あれば辞書の値に置替えてその要素文字数だけ先に処理を進める方式なので効率は良い筈である。機会があれば利用頂ければ有難い。
posted by Mire at 13:27 | Comment(0) | TrackBack(0) | Pythonプログラミング | このブログの読者になる | 更新情報をチェックする

2012年01月22日

【Unicode】半角カナ全角かな置替関数 for Python(正式公開版)

 先日よりPythonによる首記の半角カナと全角かなの置替関数の機能強化とそれに伴なう不具合の解消に取組んで来ていた訳だが、ようやく動作面ではあまり恥ずかしくない実用レベルになったので本稿で正式公開させて頂くことにする。但し置替辞書については依然充分でないかもしれないので利用した上で不具合があれば、引続きコメントを頂けると有難い。

【プログラム名】「半角カナ全角かな置替関数」モジュール
 今回より、この「半角カナ全角かな置替関数」モジュールと称することにする。従来は変換という言葉を使っていた訳だが、「かな変換」というシステムを連想させてしまうので、好ましくないと思ったからである。但し0.2.0での正順比較化以降は用途は辞書次第で日本語以外にも対応する様になった(筈な)ので、今後の辞書次第で再度名称変更となるかもしれない。

【機能と想定用途】
 日本語環境で同意の文字として登録されている半角の「カタカナ、ひらがな、英数記号」と全角の「カタカナ、ひらがな、英数記号」文字をクロスオーバー的に一括置替することで、読み易くしたり、JIS、Sift_JISやEUC-JP等他の文字コード等へ変換出力する際の文字化けを回避する等の利用を想定している。現在、Python2.x系での活用を前提に開発。

【制 限 事 項】
 濁点半濁点付きの半角カタカナ「ガ」の様に複数文字で記述するものを全角カタカナ「ガ」に置替えることが可能であり、且つ、任意の置替パターンを辞書に登録することが可能だが、それは2文字迄の対応となっている。
 また、その処理は文字列の末尾から濁点半濁点に相当する2文字目の文字候補を探して処理を進める為、頭から見て行く場合とは異なる変換を行なう特殊な場合があるやも知れない。文字で並べた言葉は機械的に切れ目が不明確な為切り方により意味が変わってしまう場合がある。例えば「シンダイシャタノム」という電報が受け手は状況が判れば「寝台車頼む」と解釈するが、「死んだ。医者頼む」と読んで医者に死亡確認と死亡診断書の発行を依頼するかもしれないし、「死んだ医者(を)頼む」と読んでしまい思考が停止する可能性も無しと迄は言いきれない。このプログラムは意識を持たないので思考停止の可能性はないがその代わりに決め打ちで処理結果を返すだけなので、後先の優先くらいしか対処出来ていない。無論日本語の濁点半濁点だけならば、濁点半濁点文字自体が本字となり濁点や半濁点を伴なう使い方は無いし、丸と点々の2つだけなので、「シンダイシャタノム」型の不具合は発生しない。この点は「alt_dic」で指定する独自の変換パターンを追加した際に似た様なことが起こり得ることを頭の隅に置いて居て頂きたい。「死んだ。医者頼む」と処理しても「新台車『タノム』」が正しかったりする場合の対処法はひたすら利用者の条件適用に依存するのみである。具体的には、半角で矢印を表すとき「->」や「<-」とすることがあるかと思う。でもこれを「alt_dic」に指定すると「-」(マイナス記号)は処理上では濁点半濁点と同じ扱いを受けるが同時に濁点半濁点を伴なう親字とも成り得る。ここでさらに「--」を長いハイフン記号として解釈して罫線記号「─」を割り当てる様に指定してしまうと「<-->」は「←→」「<─>」の両方の解釈の余地が生じてしまう。当方の後方から攻めると「<--->」は「<─→」に、コードを改めて頭から処理する様に変更したら「←─>」と異なる結果を生むことになる。そんな場合には予め文字列メソッドの「replace(str, old, new])」辺りでnewに「←-→」等と作成者の意図通りの文字列に置替えてからの利用となる。0.2.0以降では文字列を頭より正順比較し置替辞書により置替える使用とし、キーとなる文字列の長さに制限はないので、以上の点を充分に心に留置き頂きたい。

【Install方法】
 本稿掲載の「jpcode.py」全体をドラッグ選択しコピーし、「jpcode.py」を作成し、利用するpythonディレクトリにある「site-packages」に入れる。これによりPythonの標準モジュールと同じ様にimportが可能になる。ただ、「jpcode.py」のままでは、他資産とバッティングする可能性があるので以下設定例の様に、「site-packages」の下に「mire」(当方のHN)ディレクトリを作成しその中に入れた方が賢明かと思う。



[mire@localhost ~]$ cd /usr/lib/python2.6/site-packages/
[mire@localhost site-packages]$ sudo mkdir mire
[sudo] password for mire:
[mire@localhost site-packages]$ cd mire/
[mire@localhost mire]$ sudo cp ~/jpcode.py ./
[mire@localhost mire]$ sudo echo > ~/__init__.py
[mire@localhost mire]$ sudo cp ~/__init__.py ./
[mire@localhost mire]$ ls -la
合計 64
drwxr-xr-x. 2 root root 4096 1月 21 04:36 2012 .
drwxr-xr-x. 34 root root 4096 1月 21 04:31 2012 ..
-rw-r--r--. 1 root root 1 1月 21 04:36 2012 __init__.py
-rw-r--r--. 1 root root 51402 1月 21 04:32 2012 jpcode.py
[mire@localhost mire]$
[mire@localhost mire]$ cd ~
これはLinux上での「site-packages」にモジュール用のフォルダ「mire」を作成しその中に「jpcode.py」を入れる他、「__init__.py」という名の空ファイルを入れる操作。

【使  い  方】
 第1引数に置替対象文字列を指定して関数を実行することで、modeで指定したモードまたは専用関数の置替辞書の対応に従い文字を置替えた処理文字列を返す。各モードの基本辞書は関数に埋め込んでいるので逐次作成する必要性あまりないだろうが、独自の辞書をmy_dicで指定することで全く独自の置替処理を実現することも出来る。また置替対象文字列内に、各モードの基本辞書では過不足が発生する場合には、alt_dicで追加修正をdel_listで余計なものを除去することが出来る。
 また、ASCIIコードの「\」(バックスラッシュは)、日本語環境では半角の「¥」(円マーク)として使うことが一般的だが、最近ではバックスラッシュのままで表示される環境も多い。そんな場合には、全角文字の「\」(バックスラッシュ)に置替えるべく、yen=u'\'とすることも出来るし、ソースコード内のエスケープ文字として(例えば改行文字の\n等)ASCIIコードの「\」を使っている場合はyen=Noneとして置替辞書かせ除去し処理しない様にすることも出来る。任意の場所に以下サンプルコードの様にpythonのソースコードを書いて、「python example.py」とするか、または、「chmod 755 example.py」としてファイルに実行権限を与え「sample.py」で実行する。

 sample.py


#!/usr/bin/python2.6
# -*- coding: utf8 -*-

u"""
asc2zen:半角英数記号を全角化に演算子矢印置替追加例
"""
def exam_asc2zen_plus_allows(s):
from jpcode import zen_conv, asc2zen #必要な関数をimportする
print u'%s:「%s」 ⇒ 「%s」' % (
__doc__.strip()
, s
, asc2zen(s
, alt_dic={ '*':u'×', '/':u'÷' #乗除「×」「÷」
, '<-':u'←', '->':u'→'})) #矢印「←」「→」

if __name__ == '__main__':
exam_asc2zen_plus_allows(u'+-*/<- ->')
このコードを実行すると以下の様にalt_dicで指定した辞書に従い置替えが出来る。



[mire@localhost ~]$ python example.py
asc2zen:半角英数記号を全角化に演算子矢印置替追加例:「+-*/<- ->」 ⇒ 「+−×÷← →」
[mire@localhost ~]$


【ソースコード】
 ソースコードは以下の通りだ。コピペでファイルを作成してから、ご活用頂きたい。[2012-01-23修正, 2012-01-24再修正。2012-01-29再々修正。(修正箇所はコメントさせて頂いた。)]
          /usr/lib/site-packages/mire/jpcode.py (最新版)


#!/usr/loca/bin/python2.6
# -*- coding: utf-8 -*-
"""
######################################################################
# replacement of japanese full and half pitch characters
# 全角/半角仮名ASCII文字置替
# 1. zen_conv( s : 文字列s内の半角/全角カナASCII文字の置替え
# , mode : None = 設定なし
# : 'han2kata' = 1.半角カタカナを全角カタカナへ(既定値)
# : 'kata2han' = 2.全角カタカナを半角カタカナへ
# : 'han2hira' = 3.半角カタカナを全角ひらがなへ
# : 'hira2han' = 4.全角ひらがなを半角カタカナへ
# : 'asc2zen' = 5.半角英数記号を全角英数記号へ
# : 'zen2asc' = 6.全角英数記号を半角英数記号へ
# : 'han2zen' = 7.半角カタカナ英数記号を全角へ
# : 'zen2han' = 8.全角仮名文字英数記号を半角へ
# : 'kata2hira' = 9.全角カタカナを全角ひらがなへ
# : 'hira2kata' =10.全角ひらがなを全角カタカナへ
# : 'kana2han' =11.全角平片仮名を半角カタカナへ
# : 'num2zen' =12.半角算用数字を全角算用数字へ
# : 'num2han' =13.全角算用数字を半角算用数字へ
# : 'num2knm' =14.半角算用数字を普通の漢数字へ
# : 'knm2num' =15.普通の漢数字を半角算用数字へ
# : 'num2dai' =16.半角算用数字を大字表記数字へ
# : 'dai2num' =17.大字表記数字を半角算用数字へ
# : 'knm2dai' =18.普通の漢数字を大字表記数字へ
# : 'dai2knm' =19.大字表記数字を普通の漢数字へ
# : ※これ以外の指定は'han2kata'の全角カタカナへとなる
# , yen : 「\」を「¥」(既定値)以外で置替えたい文字列を指定
# : 例: 「\」に置替えなら、yen=u'\'
# : 置替えしないなら、 yen=None とする
# , alt_dic : 置替辞書へmap修正追加するものを辞書で指定
# : 例: 矢印を半角文字で表現, 全角スペースを半角2つに置替え
# : alt_dic={u'⇒':'=>', u' ':' '}
# , del_list : 置替辞書から除去する文字をlistで指定
# , my_dic : 固有の置替辞書を指定
# , pass_list: 置替除外する部分をlistで指定
# , debug) : 0:何もしない(既定値), 1以上:debugの為の情報表示あり
# modeの命名規則 : 全角ひらがな=hira, 全角カタカナ=kata, 半角=han, 全角=zen
# , ' to '='2', 半角英数記号(ascii)=asc, 半角算用数字=num
# , 普通の漢数字=knm, 大字表記数字=dai
# ※ 全て置替用辞書に依存し置替する仕組み。正順一致で置替える
#
# 2.replaces( s : 標準関数replace(s, old, new)の様な文字列sの置替関数
# , alt_dic : 上記のreplace()のoldをnewの対を辞書に指定(複数)
# , pass_list : 変換しない領域の文字列をリスト内に指定
# , mode=None : 必要により、z_conv()のmodeで置替辞書を指定
# , del_list=[]: 置替辞書から除去する文字をlistで指定
# , my_dic={} : 固有の置替辞書を指定
# , yen=u'¥' : 「\」を「¥」(既定値)以外で置替えたい文字列を指定
# , debug=0 ): 0:何もしない(既定値), 1以上:debugの為の情報表示あり
#
# 3.モード別関数(関数名のmodeを既定で指定済, zen_conv()関数の全引数の指定が可能)
# 半角カタカナを全角カタカナへ: han2kata() 全角カタカナを半角カタカナへ: kata2han()
# 半角カタカナを全角ひらがなへ: han2hira() 全角ひらがなを半角カタカナへ: hira2han()
# 半角英数記号を全角英数記号へ: asc2zen() 全角英数記号を半角英数記号へ: zen2asc()
# 半角カタカナ英数記号を全角へ: han2zen() 全角カタカナ英数記号を半角へ: zen2han()
# 全角カタカナを全角ひらがなへ: kata2hira() 全角ひらがなを全角カタカナへ: hira2kata()
# 全角平片仮名を半角カタカナへ: kana2han()
# 半角算用数字を全角算用数字へ: num2zen() 全角算用数字を半角算用数字へ: num2han()
# 半角算用数字を普通の漢数字へ: num2knm() 普通の漢数字を半角算用数字へ: knm2num()
# 半角算用数字を大字表記数字へ: num2dai() 大字表記数字を半角算用数字へ: dai2num()
# 普通の漢数字を大字表記数字へ: knm2dai() 大字表記数字を普通の漢数字へ: dai2knm()
#
# 4.数字文字置替関数
# str2int(s) : 漢数字全角数字含めた数字を整数値化
# all2int(s) : 文字列内の数字を算用数字の整数に置替え

#【更新履歴】
# 2010-05-05 0.0.0  kana2zen()として半角カナを全角のカタカナひらがなへの
# 置替機能及び、そのテストコードを公開
# 2010-05-06 0.0.1  半角への逆置替が欲しくなったので機能拡張し、kana_conv()
# としたdebug時に参照辞書の一部を確認可能にし、指定ミスを
# 発見し易くした長音記号等漏れ等の誤りを補正。多分精度的には
# まだα1クラス。
# 2012-01-13 0.0.1a  通りすがりさんご指摘の'け''ケ'のマッピングミスを修正
# 2012-01-14 0.0.2  この__DOC__のmode名hiraをhan2hiraに変更、その他も改変
# ※0.0.1a以前と非互換。今後は新命名規則でmode名を決定
# 2012-01-15 0.1.0  全角英数記号文字の半角置替をzen2han、その逆をhan2zen
# として追加半角英数記号の全角置替をasc2zen、その逆をzen2asc
# として追加し、関数名をzen_conv()に変更
# 2012-01-16 0.1.0a  引数 yen, alt_dic, del_list, my_dic を追加し個別用途の
# 置替需要に応える様に拡張開始
# 2012-01-16 0.1.1  alt_dic で追加したものに濁点半濁点が処理出来ない不具合解消
# 2012-01-19 0.1.2  利用時タイプの冗長性を軽減の為、mode別関数を作成展開
# 2012-01-22 0.1.2a  コード整理に伴なう軽微な修正とclean up
# 2012-01-22 0.2.0  置替え処理を文字列の頭から正順処理する様に修正(100行→40行)
# 置替文字数上限をなくした。逆順処理はコメント化
# 2012-01-23 0.2.1  辞書との比較を頭文字から始まる文字数分の部分文字列に変更により
# 同一頭文字の多キー存在時のループ回数を低減
# 2012-01-23 0.2.2  pass_listでキー文字列と同じ値の辞書要素を登録し一致分は
# 変更しない様にすることで置替除外箇所の指定を可能にし汎用性を向上
# 2012-01-25 0.2.3  置替用辞書として半角数字と全角数字間置替えするものを追加すると共に
# 置替辞書なしを文字列'None'で指定可能にし、単純な文字列置替関数としての
# 用途にも可能なより汎用的仕様に変更
# 2012-01-26 0.2.4 一般受け狙い?(笑)の汎用関数replaces()追加
# 2012-01-28 0.2.5 整数文字列の整数化関数str2int()の追加
# 2012-01-29 0.2.6 文字列内の整数文字列の算用数字化関数all2int()の追加
#
#【判っている課題】
# my_dic: 著者未使用の為、利用の成否は未確認。
# 数字置替系関数は単純な数字文字間の置替えのみサポート。
# 文字列中の小数点付数字は未対応
# clean up不足 sorry
"""

__author__ = "Mire in Japan"
__date__ = "2012-01-26"
__version__ = '0.2.6'
__copyright__ = 'Copyright (c) 2010-2012 Mire'
__license__ = 'GPL'
__url__ = 'http://pythonlife.seesaa.net/article/247825731.htm '

def replaces(s, alt_dic={}, pass_list=[], mode='None', del_list=[], my_dic={}
, yen=u'¥', debug=0):
"""
複数の文字列の置替ペアの辞書指定して、文字列s上の合致部分を置替た文字列を返す関数
replaces( s : 標準関数replace(s, old, new)の様な文字列sの置替関数
, alt_dic : 上記のreplace()のoldをnewの対を辞書に指定(複数)
, pass_list : 変換しない領域の文字列をリスト内に指定
, mode=None : 必要により、z_conv()のmodeで置替辞書を指定
, del_list=[]: 置替辞書から除去する文字をlistで指定
, my_dic={} : 固有の置替辞書を指定
, yen=u'¥' : 「\」を「¥」(既定値)以外で置替えたい文字列を指定
, debug=0 ): 0:何もしない(既定値), 1以上:debugの為の情報表示あり
"""
return zen_conv(s, mode=mode, alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)

allknum = u''

def han2kata(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""半角カタカナを全角カタカナへ"""
return zen_conv(s, mode='han2kata', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)
def kata2han(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""全角カタカナを半角カタカナへ"""
return zen_conv(s, mode='kata2han', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)

def han2hira(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""半角カタカナを全角ひらがなへ"""
return zen_conv(s, mode='han2hira', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)
def hira2han(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""全角ひらがなを半角カタカナへ"""
return zen_conv(s, mode='hira2han', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)

def asc2zen(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""半角英数記号を全角英数記号へ"""
return zen_conv(s, mode='asc2zen', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)
def zen2asc(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""全角英数記号を半角英数記号へ"""
return zen_conv(s, mode='zen2asc', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)

def han2zen(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""半角カタカナ英数記号を全角へ"""
return zen_conv(s, mode='han2zen', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)
def zen2han(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""全角仮名文字英数記号を半角へ"""
return zen_conv(s, mode='zen2han', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)

def kata2hira(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""全角カタカナを全角ひらがなへ"""
return zen_conv(s, mode='kata2hira', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)
def hira2kata(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""全角ひらがなを全角カタカナへ"""
return zen_conv(s, mode='hira2kata', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)

def kana2han(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""全角平片仮名を半角カタカナへ"""
return zen_conv(s, mode='kana2han', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)

def num2zen(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""半角算用数字を全角算用数字へ"""
return zen_conv(s, mode='num2zen', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)
def num2han(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""全角算用数字を半角算用数字へ"""
return zen_conv(s, mode='num2han', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)

def num2knm(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""半角算用数字を普通の漢数字へ"""
return zen_conv(s, mode='num2knm', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)
def knm2num(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""普通の漢数字を半角算用数字へ"""
return zen_conv(s, mode='knm2num', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)

def knm2dai(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""普通の漢数字を大字表記数字へ"""
return zen_conv(s, mode='knm2dai', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)
def dai2knm(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""大字表記数字を普通の漢数字へ"""
return zen_conv(s, mode='dai2knm', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)

def all2int(s, add_chars=u'', del_chars=u''):
"""数を表す全数字を算用数字に置替え"""
from re import compile, findall
all_num = (u'拾百千万億兆京垓予穣溝潤正'
+ u'01234567890123456789〇一二三四五六七八九'
+ u'〇壱弐参零壹貮貳參肆伍陸柒漆質捌玖'
+ u'零壹贰貳叁參肆伍陆陸柒柒漆捌玖')
num_strs = list(set(list(all_num+add_chars)))
for d in del_chars:
num_strs.sremove(d)
num_strs.sort()
#ptrn = u'[%s]+' % (u''.join(num_strs))
are_nums = compile(u'[%s]+' % (u''.join(num_strs)))
nums = are_nums.findall(s)
nums.sort()
nums.reverse()
#print prn_seq(findall(ptrn, s))
pat_dic = {}
for i in nums:
pat_dic[i] = u'%d' % (str2int(i))
return replaces(s, pat_dic)

def str2int(s
, piriod='.' #小数点:[u'.', u'・', u'٫', u'・']
, comma=',' #桁区切:[u',', u'٬', u',', u' ', u'.', u'、']
):
"""
漢数字、全角数字、半角数字文字列の整数化
【仕様】
1. 拾, 百, 千, 万, 億等が数字の頭にあるときは頭の一が省略されたものと看做す
2. 数字でない余計な文字を含まないこと(現在は、含むと単にpassする)
「、・」等をはさんでいる場合の解釈をどうするか詰めてから対処の予定
"""
#千以下の相対位の刻み
kizami_dic = {u'拾':10
, u'百':100, u'陌':100, u'佰':100
, u'千':1000, u'阡':1000, u'仟':1000}
#万以上の絶対位
kurai_dic = { u'万':10000, u'萬':10000
, u'億':100000000
, u'兆':1000000000000
, u'京':10000000000000000
, u'垓':100000000000000000000
, u'予':1000000000000000000000000
, u'穣':10000000000000000000000000000
, u'溝':100000000000000000000000000000000
, u'潤':1000000000000000000000000000000000000
, u'正':10000000000000000000000000000000000000000}
# 10進数の数字0〜9に当たる全文字に対する整数値の辞書
knum_dic = { '0':0, '1':1, '2':2, '3':3, '4':4
, '5':5, '6':6, '7':7, '8':8, '9':9
, u'0':0, u'1':1, u'2':2, u'3':3, u'4':4
, u'5':5, u'6':6, u'7':7, u'8':8, u'9':9
#漢数字
, u'〇':0, u'一':1, u'二':2, u'三':3, u'四':4
, u'五':5, u'六':6, u'七':7, u'八':8, u'九':9
, u'〇':0, u'壱':1, u'弐':2, u'参':3
#日本の旧大字
, u'零':0, u'壹':1, u'貮':2, u'貳':2, u'參':3
, u'肆':4, u'伍':5, u'陸':6, u'柒':7, u'漆':7
, u'質':7, u'捌':8, u'玖':9
#中国の大字
, u'零':0, u'壹':1, u'贰':2, u'貳':2, u'叁':3, u'參':3
, u'肆':4, u'伍':5, u'陆':6, u'陸':6
, u'柒':7, u'柒':7, u'漆':7, u'捌':8, u'玖':9
#アラビア・インド数字
, u'٠':0, u'١':1 , u'٢':2, u'٣':3, u'٤':4
, u'٥':5, u'٦':6 , u'٧':7, u'٨':8, u'٩':9
#タイ数字
, u'๐':0, u'๑':1, u'๒':2, u'๓':3, u'๔':4
, u'๕':5, u'๖':6, u'๗':7, u'๘':8, u'๙':9
}
r = reverse(s) #末尾文字から解釈するので文字列を反転
ketaage = k3 = k4 = 1 #各桁上げ変数を1に初期化
n = 0 #桁刻みの数の計算用
p = '' #次の処理の為一つ前の文字の区分を記録
for i in r: #末尾より一文字ずつ
if i in knum_dic: # 漢数字0〜9なら
if p=='n': # もし、一つ前もそうなら
ketaage *= 10 # kizamiに依存せず一桁上げ
n += (k3 * k4 * ketaage # 拾百千の桁刻みが省かれているものとして
* knum_dic[i]) # 一桁桁上げして加算
else: # でないなら
n += k3 * k4 * knum_dic[i] # 万以上の位と千以下の刻みをかけて加算
p = 'n' # 次の処理の為一つ前が数字文字だったと記録
elif i in kizami_dic: # 千百十の刻みなら
k3 = kizami_dic[i] # 千以下の刻み桁数を代入: 千=1000, 百=100, 拾=10
ketaage = 1 # 漢数字0〜9連続時の桁上げをクリア
p = 'z' # 次の処理の為一つ前が千以下の刻み文字だったと記録
elif i in kurai_dic: # 万以上の絶対位の文字なら
k4 = kurai_dic[i] # 万以上の絶対位の桁数を代入: 万=10000
k3 = 1 # 千以下の刻み桁数をクリア
ketaage = 1 # 漢数字0〜9連続時の桁上げをクリア
p = 'k' # 次の処理の為一つ前が万以上の位文字だったと記録
else: # それ以外は
print i, u':数字外の文字' # 取り敢えず、画面表示してpassしておく …(2)
if p=='z' or p=='k': #最後の未処理分は
n += k3 * k4 # 頭の一が省略されたものと看做し処理 …(1)
return n #結果を返す

def reverse(s):
"""Unicode文字列用の降順並替関数(python2.x系のunicode型にはreverse()メソッドがない)"""
st = list(s) #いきなりlist化
st.reverse()
return u''.join(st)

############## 2012-01-23: 文字列s の頭からの正順処理に変更した為不要に ##############
#def reverse(s):
# """
# Unicode文字列用の降順並替
# """
# st = u'%s' % (s))
# r = []
# for i in st: r.append(i)
# st.reverse()
# rs = u''
# for i in r: rs = rs + i
# return rs
#
#def sort(s):
# """
# Unicode文字列用の昇順並替
# """
# st = u'%s' % (s)
# r = []
# for i in st: r.append(i)
# r.sort()
# rs = u''
# for i in r: rs = rs + i
# return rs
##############################################################################

def zen_conv(s, mode='han2kata', yen=u'¥'
, alt_dic={}, del_list=[]
, my_dic={}, pass_list=[], debug=0):
"""
半角カナの全角カナ置替関数
===================

第一引数 置替
mode(次の変換モードを指定)::

'han2kata' : 1.半角カタカナを全角カタカナへ(既定値)
'kata2han' : 2.全角カタカナを半角カタカナへ
'han2hira' : 3.半角カタカナを全角ひらがなへ
'hira2han' : 4.全角ひらがなを半角カタカナへ
'asc2zen' : 5.半角英数記号を全角英数記号へ
'zen2asc' : 6.全角英数記号を半角英数記号へ
'han2zen' : 7.半角カタカナ英数記号を全角へ
'zen2han' : 8.全角仮名文字英数記号を半角へ
'kata2hira': 9.全角カタカナを全角ひらがなへ
'hira2kata':10.全角ひらがなを全角カタカナへ
'kana2han' :11.全角平片仮名を半角カタカナへ
'num2zen' :12.半角算用数字を全角算用数字へ
'num2han' :13.全角算用数字を半角算用数字へ
'num2knm' :14.半角算用数字を普通の漢数字へ
'knm2num' :15.普通の漢数字を半角算用数字へ
'num2dai' :16.半角算用数字を大字表記数字へ
'dai2num' :17.大字表記数字を半角算用数字へ
'knm2dai' :18.普通の漢数字を大字表記数字へ
'dai2knm' :19.大字表記数字を普通の漢数字へ
[命名規則 :hira=全角ひらがな, kata=全角カタカナ, han=半角, zen=全角
asc=半角英数記号(ascii文字), ' to '='2']

yen('\'を'¥'以外置替る文字を指定)::

u'¥' :'\'を'¥'に置替(既定)
u'\' :'\'を'\'に置替
None :'\'を置替えない


alt_dic={}置替対象文字の対を辞書で指定し置替を追加修正::

alt_dic=
例: {u'→':'->', u'⇒':'=>'}(矢印を半角で表現)
{'/':u'÷'} (数式の除算記号に置替)
{'\\':u'\'} (※yen=u'\'と等価)

del_list(置替対象文字をリスト指定し置替除外)
del_list=
[] :この関数標準の置替辞書をそのまま使う(既定)
例:['+', '-', '*', '/', '=']
pass_list 置替対象としたくない部分をリスト指定し置替除外
pass_list=
[] :文字列s全文に対し置替え処理を行なう
例: [u'こんにちわ', u'さようなら'] 挨拶部分のみ変換から除外
my_dic={} 添付の11種の置替辞書以外の自前置替辞書を指定
"""

## 1.半角カタカナ ⇒ 全角カタカナ 辞書 ##
han2kata = {
u'ア':u'ア', u'イ':u'イ', u'ウ':u'ウ', u'エ':u'エ', u'オ':u'オ'
, u'カ':u'カ', u'キ':u'キ', u'ク':u'ク', u'ケ':u'ケ', u'コ':u'コ'
, u'サ':u'サ', u'シ':u'シ', u'ス':u'ス', u'セ':u'セ', u'ソ':u'ソ'
, u'タ':u'タ', u'チ':u'チ', u'ツ':u'ツ', u'テ':u'テ', u'ト':u'ト'
, u'ナ':u'ナ', u'ニ':u'ニ', u'ヌ':u'ヌ', u'ネ':u'ネ', u'ノ':u'ノ'
, u'ハ':u'ハ', u'ヒ':u'ヒ', u'フ':u'フ', u'ヘ':u'ヘ', u'ホ':u'ホ'
, u'マ':u'マ', u'ミ':u'ミ', u'ム':u'ム', u'メ':u'メ', u'モ':u'モ'
, u'ヤ':u'ヤ', u'ユ':u'ユ', u'ヨ':u'ヨ', u'゚':u'゜', u'゙':u'゛'
, u'ラ':u'ラ', u'リ':u'リ', u'ル':u'ル', u'レ':u'レ', u'ロ':u'ロ'
, u'ワ':u'ワ', u'ン':u'ン', u'「':u'「', u'」':u'」', u'。':u'。'
, u'、':u'、', u'・':u'・', u'ァ':u'ァ', u'ィ':u'ィ', u'ゥ':u'ゥ'
, u'ェ':u'ェ', u'ォ':u'ォ', u'ャ':u'ャ', u'ュ':u'ュ', u'ョ':u'ョ'

, u'ガ':u'ガ', u'ギ':u'ギ', u'グ':u'グ', u'ゲ':u'ゲ', u'ゴ':u'ゴ'
, u'ザ':u'ザ', u'ジ':u'ジ', u'ズ':u'ズ', u'ゼ':u'ゼ', u'ゾ':u'ゾ'
, u'ダ':u'ダ', u'ヂ':u'ヂ', u'ヅ':u'ヅ', u'デ':u'デ', u'ド':u'ド'
, u'バ':u'バ', u'ビ':u'ビ', u'ブ':u'ブ', u'ベ':u'ベ', u'ボ':u'ボ'
, u'パ':u'パ', u'ピ':u'ピ', u'プ':u'プ', u'ペ':u'ペ', u'ポ':u'ポ'
, u'ヴ':u'ヴ'
, u'ヲ' :u'ヲ', u'ー':u'ー'}

## 2.全角カタカナ ⇒ 半角カタカナ 辞書 ##
kata2han = {
u'ア':u'ア', u'イ':u'イ', u'ウ':u'ウ', u'エ':u'エ', u'オ':u'ケ'
, u'カ':u'カ', u'キ':u'キ', u'ク':u'ク', u'ケ':u'ケ', u'コ':u'コ'
, u'サ':u'サ', u'シ':u'シ', u'ス':u'ス', u'セ':u'セ', u'ソ':u'ソ'
, u'タ':u'タ', u'チ':u'チ', u'ツ':u'ツ', u'テ':u'テ', u'ト':u'ト'
, u'ナ':u'ナ', u'ニ':u'ニ', u'ヌ':u'ヌ', u'ネ':u'ネ', u'ノ':u'ノ'
, u'ハ':u'ハ', u'ヒ':u'ヒ', u'フ':u'フ', u'ヘ':u'ヘ', u'ホ':u'ホ'
, u'マ':u'マ', u'ミ':u'ミ', u'ム':u'ム', u'メ':u'メ', u'モ':u'モ'
, u'ヤ':u'ヤ', u'ユ':u'ユ', u'ヨ':u'ヨ', u'゜':u'゚', u'゛':u'゙'
, u'ラ':u'ラ', u'リ':u'リ', u'ル':u'ル', u'レ':u'レ', u'ロ':u'ロ'
, u'ワ':u'ワ', u'ン':u'ン', u'「':u'「', u'」':u'」', u'。':u'。'
, u'、':u'、', u'・':u'・', u'ァ':u'ァ', u'ィ':u'ィ', u'ゥ':u'ゥ'
, u'ェ':u'ェ', u'ォ':u'ォ', u'ャ':u'ャ', u'ュ':u'ュ', u'ョ':u'ョ'

, u'ガ':u'ガ', u'ギ':u'ギ', u'グ':u'グ', u'ゲ':u'ゲ', u'ゴ':u'ゴ'
, u'ザ':u'ザ', u'ジ':u'ジ', u'ズ':u'ズ', u'ゼ':u'ゼ', u'ゾ':u'ゾ'
, u'ダ':u'ダ', u'ヂ':u'ヂ', u'ヅ':u'ヅ', u'デ':u'デ', u'ド':u'ド'
, u'バ':u'バ', u'ビ':u'ビ', u'ブ':u'ブ', u'ベ':u'ベ', u'ボ':u'ボ'
, u'パ':u'バ', u'ピ':u'ピ', u'プ':u'プ', u'ペ':u'ペ', u'ポ':u'ポ'
, u'ヴ':u'ヴ'
, u'ヲ':u'ヲ' , u'ー':u'ー'}

## 3.半角カタカナ ⇒ 全角ひらがな 辞書 ##
han2hira = {
u'ア':u'あ', u'イ':u'い', u'ウ':u'う', u'エ':u'え', u'オ':u'お'
, u'カ':u'か', u'キ':u'き', u'ク':u'く', u'ケ':u'け', u'コ':u'こ'
, u'サ':u'さ', u'シ':u'し', u'ス':u'す', u'セ':u'せ', u'ソ':u'そ'
, u'タ':u'た', u'チ':u'ち', u'ツ':u'つ', u'テ':u'て', u'ト':u'と'
, u'ナ':u'な', u'ニ':u'に', u'ヌ':u'ぬ', u'ネ':u'ね', u'ノ':u'の'
, u'ハ':u'は', u'ヒ':u'ひ', u'フ':u'ふ', u'ヘ':u'へ', u'ホ':u'ほ'
, u'マ':u'ま', u'ミ':u'み', u'ム':u'む', u'メ':u'め', u'モ':u'も'
, u'ヤ':u'や', u'ユ':u'ゆ', u'ヨ':u'よ', u'゚':u'゜', u'゙':u'゛'
, u'ラ':u'ら', u'リ':u'り', u'ル':u'る', u'レ':u'れ', u'ロ':u'ろ'
, u'ワ':u'わ', u'ン':u'ん', u'「':u'「', u'」':u'」', u'。':u'。'
, u'、':u'、', u'・':u'・', u'ァ':u'ぁ', u'ィ':u'ぃ', u'ゥ':u'ぅ'
, u'ェ':u'ぇ', u'ォ':u'ぉ', u'ャ':u'ゃ', u'ュ':u'ゅ', u'ョ':u'ょ'

, u'ガ':u'が', u'ギ':u'ぎ', u'グ':u'ぐ', u'ゲ':u'げ', u'ゴ':u'ご'
, u'ザ':u'ざ', u'ジ':u'じ', u'ズ':u'ず', u'ゼ':u'ぜ', u'ゾ':u'ぞ'
, u'ダ':u'だ', u'ヂ':u'ぢ', u'ヅ':u'づ', u'デ':u'で', u'ド':u'ど'
, u'バ':u'ば', u'ビ':u'び', u'ブ':u'ぶ', u'ベ':u'べ', u'ボ':u'ぼ'
, u'パ':u'ぱ', u'ピ':u'ぴ', u'プ':u'ぷ', u'ペ':u'ぺ', u'ポ':u'ぽ'
, u'ヴ':u'ヴ' #2012-01-19 'ヴ'を見付け追加
, u'ヲ':u'を' , u'ー':u'ー'}

## 4.全角ひらがな ⇒ 半角カタカナ 辞書 ##
hira2han = {
u'あ':u'ア', u'い':u'イ', u'う':u'ウ', u'え':u'エ', u'お':u'オ'
, u'か':u'カ', u'き':u'キ', u'く':u'ク', u'け':u'ケ', u'こ':u'コ'
, u'さ':u'サ', u'し':u'シ', u'す':u'ス', u'せ':u'セ', u'そ':u'ソ'
, u'た':u'タ', u'ち':u'チ', u'つ':u'ツ', u'て':u'テ', u'と':u'ト'
, u'な':u'ナ', u'に':u'ニ', u'ぬ':u'ヌ', u'ね':u'ネ', u'の':u'ノ'
, u'は':u'ハ', u'ひ':u'ヒ', u'ふ':u'フ', u'へ':u'ヘ', u'ほ':u'ホ'
, u'ま':u'マ', u'み':u'ミ', u'む':u'ム', u'め':u'メ', u'も':u'モ'
, u'や':u'ヤ', u'ゆ':u'ユ', u'よ':u'ヨ', u'゜':u'゚', u'゛':u'゙'
, u'ら':u'ラ', u'り':u'リ', u'る':u'ル', u'れ':u'レ', u'ろ':u'ロ'
, u'わ':u'ワ', u'ん':u'ン', u'「':u'「', u'」':u'」', u'。':u'。'
, u'、':u'、', u'・':u'・', u'ぁ':u'ァ', u'ぃ':u'ィ', u'ぅ':u'ゥ'
, u'ぇ':u'ェ', u'ぉ':u'ォ', u'ゃ':u'ャ', u'ゅ':u'ュ', u'ょ':u'ョ'

, u'が':u'ガ', u'ぎ':u'ギ', u'ぐ':u'グ', u'げ':u'ゲ', u'ご':u'ゴ'
, u'ざ':u'ザ', u'じ':u'ジ', u'ず':u'ズ', u'ぜ':u'ゼ', u'ぞ':u'ゾ'
, u'だ':u'ダ', u'ぢ':u'ヂ', u'づ':u'ヅ', u'で':u'デ', u'ど':u'ド'
, u'ば':u'バ', u'び':u'ビ', u'ぶ':u'ブ', u'べ':u'ベ', u'ぼ':u'ボ'
, u'ぱ':u'パ', u'ぴ':u'ピ', u'ぷ':u'プ', u'ぺ':u'ペ', u'ぽ':u'ポ'
, u'ヴ':u'ヴ' #2012-01-19 'ヴ'を見付け追加
, u'を':u'ヲ' , u'ー':u'ー'}

## 5.半角英数記号 ⇒ 全角英数記号 辞書 ##
asc2zen = {'A':u'A', 'B':u'B', 'C':u'C', 'D':u'D', 'E':u'E'
,'F':u'F', 'G':u'G', 'H':u'H', 'I':u'I', 'J':u'J'
,'K':u'K', 'L':u'L', 'M':u'M', 'N':u'N', 'O':u'O'
,'P':u'P', 'Q':u'Q', 'R':u'R', 'S':u'S', 'T':u'T'
,'U':u'U', 'V':u'V', 'W':u'W', 'X':u'X', 'Y':u'Y'
,'Z':u'Z', '!':u'!', '\"':u'”', '#':u'#', '$':u'$'
,'%':u'%', '&':u'&', '\'':u'’', '(':u'(', ')':u')'
,'~':u'〜', '-':u'−', '=':u'=', '^':u'^', '~':u'〜'
,'\\':u'¥', '|':u'|', '@':u'@', '`':u'‘', '[':u'['
,'{':u'{', ';':u';', '+':u'+', ':':u':', '*':u'*'
,']':u']', '}':u'}', ',':u',', '<':u'<', '.':u'.'
,'>':u'>', '/':u'/', '?':u'?', '_':u'_'
,'a':u'a', 'b':u'b', 'c':u'c', 'd':u'd', 'e':u'e'
,'f':u'f', 'g':u'g', 'h':u'h', 'i':u'i', 'j':u'j'
,'k':u'k', 'l':u'l', 'm':u'm', 'n':u'n', 'o':u'o'
,'p':u'p', 'q':u'q', 'r':u'r', 's':u's', 't':u't'
,'u':u'u', 'v':u'v', 'w':u'w', 'x':u'x', 'y':u'y'
,'z':u'z'
, '0':u'0', '1':u'1', '2':u'2', '3':u'3', '4':u'4'
,'5':u'5', '6':u'6', '7':u'7', '8':u'8', '9':u'9'}

## 6.全角英数記号 ⇒ 半角英数記号 辞書 ##
zen2asc = {u'A':'A', u'B':'B', u'C':'C', u'D':'D', u'E':'E'
, u'F':'F', u'G':'G', u'H':'H', u'I':'I', u'J':'J'
, u'K':'K', u'L':'L', u'M':'M', u'N':'N', u'O':'O'
, u'P':'P', u'Q':'Q', u'R':'R', u'S':'S', u'T':'T'
, u'U':'U', u'V':'V', u'W':'W', u'X':'X', u'Y':'Y'
, u'Z':'z', u'!':'!', u'”':'\"', u'#':'#', u'$':'$'
, u'%':'%', u'&':'&', u'’':'\'', u'(':'(', u')':')'
, u'−':'-', u'=':'=', u'^':'^', u'〜':'~', u'¥':'\\'
, u'@':'@', u'‘':'`', u'[':'[', u'{':'{', u';':';'
, u'+':'+', u':':':', u'*':'*', u']':']', u'}':'}'
, u',':',', u'<':'<', u'.':'.', u'>':'>', u'/':'/'
, u'?':'?', u'\':'\\', u'_':'_'

, u'a':'a', u'b':'b', u'c':'c', u'd':'d', u'e':'e'
, u'f':'f', u'g':'g', u'h':'h', u'i':'i', u'j':'j'
, u'k':'k', u'l':'l', u'm':'m', u'n':'n', u'o':'o'
, u'p':'p', u'q':'q', u'r':'r', u's':'s', u't':'t'
, u'u':'u', u'v':'v', u'w':'w', u'x':'x', u'y':'y'
, u'z':'z'
, u'0':'0', u'1':'1', u'2':'2', u'3':'3', u'4':'4'
, u'5':'5', u'6':'6', u'7':'7', u'8':'8', u'9':'9'}

## 7.半角カタカナ英数記号 ⇒ 全角全角 辞書 ##
han2zen = {'A':u'A', 'B':u'B', 'C':u'C', 'D':u'D', 'E':u'E'
,'F':u'F', 'G':u'G', 'H':u'H', 'I':u'I', 'J':u'J'
,'K':u'K', 'L':u'L', 'M':u'M', 'N':u'N', 'O':u'O'
,'P':u'P', 'Q':u'Q', 'R':u'R', 'S':u'S', 'T':u'T'
,'U':u'U', 'V':u'V', 'W':u'W', 'X':u'X', 'Y':u'Y'
,'Z':u'Z', '!':u'!', '\"':u'”', '#':u'#', '$':u'$'
,'%':u'%', '&':u'&', '\'':u'’', '(':u'(', ')':u')'
,'~':u'〜', '-':u'−', '=':u'=', '^':u'^', '~':u'〜'
,'\\':u'¥', '|':u'|', '@':u'@', '`':u'‘', '[':u'['
,'{':u'{', ';':u';', '+':u'+', ':':u':', '*':u'*'
,']':u']', '}':u'}', ',':u',', '<':u'<', '.':u'.'
,'>':u'>', '/':u'/', '?':u'?', '_':u'_'
,'a':u'a', 'b':u'b', 'c':u'c', 'd':u'd', 'e':u'e'
,'f':u'f', 'g':u'g', 'h':u'h', 'i':u'i', 'j':u'j'
,'k':u'k', 'l':u'l', 'm':u'm', 'n':u'n', 'o':u'o'
,'p':u'p', 'q':u'q', 'r':u'r', 's':u's', 't':u't'
,'u':u'u', 'v':u'v', 'w':u'w', 'x':u'x', 'y':u'y'
,'z':u'z'

, '0':u'0', '1':u'1', '2':u'2', '3':u'3', '4':u'4'
,'5':u'5', '6':u'6', '7':u'7', '8':u'8', '9':u'9'
, u'ア':u'ア', u'イ':u'イ', u'ウ':u'ウ', u'エ':u'エ', u'オ':u'オ'
, u'カ':u'カ', u'キ':u'キ', u'ク':u'ク', u'ケ':u'ケ', u'コ':u'コ'
, u'サ':u'サ', u'シ':u'シ', u'ス':u'ス', u'セ':u'セ', u'ソ':u'ソ'
, u'タ':u'タ', u'チ':u'チ', u'ツ':u'ツ', u'テ':u'テ', u'ト':u'ト'
, u'ナ':u'ナ', u'ニ':u'ニ', u'ヌ':u'ヌ', u'ネ':u'ネ', u'ノ':u'ノ'
, u'ハ':u'ハ', u'ヒ':u'ヒ', u'フ':u'フ', u'ヘ':u'ヘ', u'ホ':u'ホ'
, u'マ':u'マ', u'ミ':u'ミ', u'ム':u'ム', u'メ':u'メ', u'モ':u'モ'
, u'ヤ':u'ヤ', u'ユ':u'ユ', u'ヨ':u'ヨ', u'゚':u'゜', u'゙':u'゛'
, u'ラ':u'ラ', u'リ':u'リ', u'ル':u'ル', u'レ':u'レ', u'ロ':u'ロ'
, u'ワ':u'ワ', u'ン':u'ン', u'「':u'「', u'」':u'」', u'。':u'。'
, u'、':u'、', u'・':u'・', u'ァ':u'ァ', u'ィ':u'ィ', u'ゥ':u'ゥ'
, u'ェ':u'ェ', u'ォ':u'ォ', u'ャ':u'ャ', u'ュ':u'ュ', u'ョ':u'ョ'

, u'ガ':u'ガ', u'ギ':u'ギ', u'グ':u'グ', u'ゲ':u'ゲ', u'ゴ':u'ゴ'
, u'ザ':u'ザ', u'ジ':u'ジ', u'ズ':u'ズ', u'ゼ':u'ゼ', u'ゾ':u'ゾ'
, u'ダ':u'ダ', u'ヂ':u'ヂ', u'ヅ':u'ヅ', u'デ':u'デ', u'ド':u'ド'
, u'バ':u'バ', u'ビ':u'ビ', u'ブ':u'ブ', u'ベ':u'ベ', u'ボ':u'ボ'
, u'パ':u'パ', u'ピ':u'ピ', u'プ':u'プ', u'ペ':u'ペ', u'ポ':u'ポ'
, u'ヴ':u'ヴ'
, u'ヲ' :u'ヲ', u'ー':u'ー'}

## 8.全角仮名文字英数記号 ⇒ 半角 辞書 ##
zen2han = {
u'A':'A', u'B':'B', u'C':'C', u'D':'D', u'E':'E'
, u'F':'F', u'G':'G', u'H':'H', u'I':'I', u'J':'J'
, u'K':'K', u'L':'L', u'M':'M', u'N':'N', u'O':'O'
, u'P':'P', u'Q':'Q', u'R':'R', u'S':'S', u'T':'T'
, u'U':'U', u'V':'V', u'W':'W', u'X':'X', u'Y':'Y'
, u'Z':'z', u'!':'!', u'”':'\"', u'#':'#', u'$':'$'
, u'%':'%', u'&':'&', u'’':'\'', u'(':'(', u')':')'
, u'−':'-', u'=':'=', u'^':'^', u'〜':'~', u'¥':'\\'
, u'@':'@', u'‘':'`', u'[':'[', u'{':'{', u';':';'
, u'+':'+', u':':':', u'*':'*', u']':']', u'}':'}'
, u',':',', u'<':'<', u'.':'.', u'>':'>', u'/':'/'
, u'?':'?', u'\':'\\', u'_':'_'
, u'a':'a', u'b':'b', u'c':'c', u'd':'d', u'e':'e'
, u'f':'f', u'g':'g', u'h':'h', u'i':'i', u'j':'j'
, u'k':'k', u'l':'l', u'm':'m', u'n':'n', u'o':'o'
, u'p':'p', u'q':'q', u'r':'r', u's':'s', u't':'t'
, u'u':'u', u'v':'v', u'w':'w', u'x':'x', u'y':'y'
, u'z':'z'
, u'0':'0', u'1':'1', u'2':'2', u'3':'3', u'4':'4'
, u'5':'5', u'6':'6', u'7':'7', u'8':'8', u'9':'9'
, u'ア':u'ア', u'イ':u'イ', u'ウ':u'ウ', u'エ':u'エ', u'オ':u'ケ'
, u'カ':u'カ', u'キ':u'キ', u'ク':u'ク', u'ケ':u'ケ', u'コ':u'コ'
, u'サ':u'サ', u'シ':u'シ', u'ス':u'ス', u'セ':u'セ', u'ソ':u'ソ'
, u'タ':u'タ', u'チ':u'チ', u'ツ':u'ツ', u'テ':u'テ', u'ト':u'ト'
, u'ナ':u'ナ', u'ニ':u'ニ', u'ヌ':u'ヌ', u'ネ':u'ネ', u'ノ':u'ノ'
, u'ハ':u'ハ', u'ヒ':u'ヒ', u'フ':u'フ', u'ヘ':u'ヘ', u'ホ':u'ホ'
, u'マ':u'マ', u'ミ':u'ミ', u'ム':u'ム', u'メ':u'メ', u'モ':u'モ'
, u'ヤ':u'ヤ', u'ユ':u'ユ', u'ヨ':u'ヨ', u'゜':u'゚', u'゛':u'゙'
, u'ラ':u'ラ', u'リ':u'リ', u'ル':u'ル', u'レ':u'レ', u'ロ':u'ロ'
, u'ワ':u'ワ', u'ン':u'ン', u'「':u'「', u'」':u'」', u'。':u'。'
, u'、':u'、', u'・':u'・', u'ァ':u'ァ', u'ィ':u'ィ', u'ゥ':u'ゥ'
, u'ェ':u'ェ', u'ォ':u'ォ', u'ャ':u'ャ', u'ュ':u'ュ', u'ョ':u'ョ'

, u'ガ':u'ガ', u'ギ':u'ギ', u'グ':u'グ', u'ゲ':u'ゲ', u'ゴ':u'ゴ'
, u'ザ':u'ザ', u'ジ':u'ジ', u'ズ':u'ズ', u'ゼ':u'ゼ', u'ゾ':u'ゾ'
, u'ダ':u'ダ', u'ヂ':u'ヂ', u'ヅ':u'ヅ', u'デ':u'デ', u'ド':u'ド'
, u'バ':u'バ', u'ビ':u'ビ', u'ブ':u'ブ', u'ベ':u'ベ', u'ボ':u'ボ'
, u'パ':u'バ', u'ピ':u'ピ', u'プ':u'プ', u'ペ':u'ペ', u'ポ':u'ポ'
, u'ヴ':u'ヴ'
, u'ヲ':u'ヲ'

, u'あ':u'ア', u'い':u'イ', u'う':u'ウ', u'え':u'エ', u'お':u'オ'
, u'か':u'カ', u'き':u'キ', u'く':u'ク', u'け':u'ケ', u'こ':u'コ'
, u'さ':u'サ', u'し':u'シ', u'す':u'ス', u'せ':u'セ', u'そ':u'ソ'
, u'た':u'タ', u'ち':u'チ', u'つ':u'ツ', u'て':u'テ', u'と':u'ト'
, u'な':u'ナ', u'に':u'ニ', u'ぬ':u'ヌ', u'ね':u'ネ', u'の':u'ノ'
, u'は':u'ハ', u'ひ':u'ヒ', u'ふ':u'フ', u'へ':u'ヘ', u'ほ':u'ホ'
, u'ま':u'マ', u'み':u'ミ', u'む':u'ム', u'め':u'メ', u'も':u'モ'
, u'や':u'ヤ', u'ゆ':u'ユ', u'よ':u'ヨ', u'゜':u'゚', u'゛':u'゙'
, u'ら':u'ラ', u'り':u'リ', u'る':u'ル', u'れ':u'レ', u'ろ':u'ロ'
, u'わ':u'ワ', u'ん':u'ン'
, u'、':u'、', u'・':u'・', u'ぁ':u'ァ', u'ぃ':u'ィ', u'ぅ':u'ゥ'
, u'ぇ':u'ェ', u'ぉ':u'ォ', u'ゃ':u'ャ', u'ゅ':u'ュ', u'ょ':u'ョ'

, u'が':u'ガ', u'ぎ':u'ギ', u'ぐ':u'グ', u'げ':u'ゲ', u'ご':u'ゴ'
, u'ざ':u'ザ', u'じ':u'ジ', u'ず':u'ズ', u'ぜ':u'ゼ', u'ぞ':u'ゾ'
, u'だ':u'ダ', u'ぢ':u'ヂ', u'づ':u'ヅ', u'で':u'デ', u'ど':u'ド'
, u'ば':u'バ', u'び':u'ビ', u'ぶ':u'ブ', u'べ':u'ベ', u'ぼ':u'ボ'
, u'ぱ':u'パ', u'ぴ':u'ピ', u'ぷ':u'プ', u'ぺ':u'ペ', u'ぽ':u'ポ'
, u'ヴ':u'ヴ' #2012-01-19 'ヴ'を見付け追加
, u'を':u'ヲ' , u'ー':u'ー'}

## 9.全角カタカナ ⇒ 全角ひらがな 辞書 ##
kata2hira = {
u'ア':u'あ', u'イ':u'い', u'ウ':u'う', u'エ':u'え', u'オ':u'お'
, u'カ':u'か', u'キ':u'き', u'ク':u'く', u'ケ':u'け', u'コ':u'こ'
, u'サ':u'さ', u'シ':u'し', u'ス':u'す', u'セ':u'せ', u'ソ':u'そ'
, u'タ':u'た', u'チ':u'ち', u'ツ':u'つ', u'テ':u'て', u'ト':u'と'
, u'ナ':u'な', u'ニ':u'に', u'ヌ':u'ぬ', u'ネ':u'ね', u'ノ':u'の'
, u'ハ':u'は', u'ヒ':u'ひ', u'フ':u'ふ', u'ヘ':u'へ', u'ホ':u'ほ'
, u'マ':u'ま', u'ミ':u'み', u'ム':u'む', u'メ':u'め', u'モ':u'も'
, u'ヤ':u'や', u'ユ':u'ゆ', u'ヨ':u'よ', u'゜':u'゜', u'゛':u'゛'
, u'ラ':u'ら', u'リ':u'り', u'ル':u'る', u'レ':u'れ', u'ロ':u'ろ'
, u'ワ':u'わ', u'ン':u'ん'
, u'ァ':u'ぁ', u'ィ':u'ぃ', u'ゥ':u'ぅ'
, u'ェ':u'ぇ', u'ォ':u'ぉ', u'ャ':u'ゃ', u'ュ':u'ゅ', u'ョ':u'ょ'

, u'ガ':u'が', u'ギ':u'ぎ', u'グ':u'ぐ', u'ゲ':u'げ', u'ゴ':u'ご'
, u'ザ':u'ざ', u'ジ':u'じ', u'ズ':u'ず', u'ゼ':u'ぜ', u'ゾ':u'ぞ'
, u'ダ':u'だ', u'ヂ':u'ぢ', u'ヅ':u'づ', u'デ':u'で', u'ド':u'ど'
, u'バ':u'ば', u'ビ':u'び', u'ブ':u'ぶ', u'ベ':u'べ', u'ボ':u'ぼ'
, u'パ':u'ぱ', u'ピ':u'ぴ', u'プ':u'ぷ', u'ペ':u'ぺ', u'ポ':u'ぽ'
, u'ヴ':u'ヴ' #2012-01-19 'ヴ'を見付け追加
, u'ヲ':u'を'}

## 10.全角ひらがな ⇒ 全角カタカナ 辞書 ##
hira2kata = {
u'あ':u'ア', u'い':u'イ', u'う':u'ウ', u'え':u'エ', u'お':u'オ'
, u'か':u'カ', u'き':u'キ', u'く':u'ク', u'け':u'ケ', u'こ':u'コ'
, u'さ':u'サ', u'し':u'シ', u'す':u'ス', u'せ':u'セ', u'そ':u'ソ'
, u'た':u'タ', u'ち':u'チ', u'つ':u'ツ', u'て':u'テ', u'と':u'ト'
, u'な':u'ナ', u'に':u'ニ', u'ぬ':u'ヌ', u'ね':u'ネ', u'の':u'ノ'
, u'は':u'ハ', u'ひ':u'ヒ', u'ふ':u'フ', u'へ':u'ヘ', u'ほ':u'ホ'
, u'ま':u'マ', u'み':u'ミ', u'む':u'ム', u'め':u'メ', u'も':u'モ'
, u'や':u'ヤ', u'ゆ':u'ユ', u'よ':u'ヨ', u'゜':u'゜', u'゛':u'゛'
, u'ら':u'ラ', u'り':u'リ', u'る':u'ル', u'れ':u'レ', u'ろ':u'ロ'
, u'わ':u'ワ', u'ん':u'ン' #, u'「':u'「', u'」':u'」', u'。':u'。'
, u'ぁ':u'ァ', u'ぃ':u'ィ', u'ぅ':u'ゥ'
, u'ぇ':u'ェ', u'ぉ':u'ォ', u'ゃ':u'ャ', u'ゅ':u'ュ', u'ょ':u'ョ'

, u'が':u'ガ', u'ぎ':u'ギ', u'ぐ':u'グ', u'げ':u'ゲ', u'ご':u'ゴ'
, u'ざ':u'ザ', u'じ':u'ジ', u'ず':u'ズ', u'ぜ':u'ゼ', u'ぞ':u'ゾ'
, u'だ':u'ダ', u'ぢ':u'ヂ', u'づ':u'ヅ', u'で':u'デ', u'ど':u'ド'
, u'ば':u'バ', u'び':u'ビ', u'ぶ':u'ブ', u'べ':u'ベ', u'ぼ':u'ボ'
, u'ぱ':u'パ', u'ぴ':u'ピ', u'ぷ':u'プ', u'ぺ':u'ペ', u'ぽ':u'ポ'
, u'ヴ':u'ヴ' #2012-01-19 'ヴ'を見付け追加
, u'を':u'ヲ'}

## 11.全角平片仮名 ⇒ 半角カタカナ半角カナ 辞書 ##
kana2han = {
u'ア':u'ア', u'イ':u'イ', u'ウ':u'ウ', u'エ':u'エ', u'オ':u'ケ'
, u'カ':u'カ', u'キ':u'キ', u'ク':u'ク', u'ケ':u'ケ', u'コ':u'コ'
, u'サ':u'サ', u'シ':u'シ', u'ス':u'ス', u'セ':u'セ', u'ソ':u'ソ'
, u'タ':u'タ', u'チ':u'チ', u'ツ':u'ツ', u'テ':u'テ', u'ト':u'ト'
, u'ナ':u'ナ', u'ニ':u'ニ', u'ヌ':u'ヌ', u'ネ':u'ネ', u'ノ':u'ノ'
, u'ハ':u'ハ', u'ヒ':u'ヒ', u'フ':u'フ', u'ヘ':u'ヘ', u'ホ':u'ホ'
, u'マ':u'マ', u'ミ':u'ミ', u'ム':u'ム', u'メ':u'メ', u'モ':u'モ'
, u'ヤ':u'ヤ', u'ユ':u'ユ', u'ヨ':u'ヨ', u'゜':u'゚', u'゛':u'゙'
, u'ラ':u'ラ', u'リ':u'リ', u'ル':u'ル', u'レ':u'レ', u'ロ':u'ロ'
, u'ワ':u'ワ', u'ン':u'ン', u'「':u'「', u'」':u'」', u'。':u'。'
, u'、':u'、', u'・':u'・', u'ァ':u'ァ', u'ィ':u'ィ', u'ゥ':u'ゥ'
, u'ェ':u'ェ', u'ォ':u'ォ', u'ャ':u'ャ', u'ュ':u'ュ', u'ョ':u'ョ'

, u'ガ':u'ガ', u'ギ':u'ギ', u'グ':u'グ', u'ゲ':u'ゲ', u'ゴ':u'ゴ'
, u'ザ':u'ザ', u'ジ':u'ジ', u'ズ':u'ズ', u'ゼ':u'ゼ', u'ゾ':u'ゾ'
, u'ダ':u'ダ', u'ヂ':u'ヂ', u'ヅ':u'ヅ', u'デ':u'デ', u'ド':u'ド'
, u'バ':u'バ', u'ビ':u'ビ', u'ブ':u'ブ', u'ベ':u'ベ', u'ボ':u'ボ'
, u'パ':u'バ', u'ピ':u'ピ', u'プ':u'プ', u'ペ':u'ペ', u'ポ':u'ポ'
, u'ヴ':u'ヴ'
, u'ヲ':u'ヲ'

, u'あ':u'ア', u'い':u'イ', u'う':u'ウ', u'え':u'エ', u'お':u'オ'
, u'か':u'カ', u'き':u'キ', u'く':u'ク', u'け':u'ケ', u'こ':u'コ'
, u'さ':u'サ', u'し':u'シ', u'す':u'ス', u'せ':u'セ', u'そ':u'ソ'
, u'た':u'タ', u'ち':u'チ', u'つ':u'ツ', u'て':u'テ', u'と':u'ト'
, u'な':u'ナ', u'に':u'ニ', u'ぬ':u'ヌ', u'ね':u'ネ', u'の':u'ノ'
, u'は':u'ハ', u'ひ':u'ヒ', u'ふ':u'フ', u'へ':u'ヘ', u'ほ':u'ホ'
, u'ま':u'マ', u'み':u'ミ', u'む':u'ム', u'め':u'メ', u'も':u'モ'
, u'や':u'ヤ', u'ゆ':u'ユ', u'よ':u'ヨ', u'゜':u'゚' , u'゛':u'゙'
, u'ら':u'ラ', u'り':u'リ', u'る':u'ル', u'れ':u'レ', u'ろ':u'ロ'
, u'わ':u'ワ', u'ん':u'ン'
, u'、':u'、', u'・':u'・', u'ぁ':u'ァ', u'ぃ':u'ィ', u'ぅ':u'ゥ'
, u'ぇ':u'ェ', u'ぉ':u'ォ', u'ゃ':u'ャ', u'ゅ':u'ュ', u'ょ':u'ョ'

, u'が':u'ガ', u'ぎ':u'ギ', u'ぐ':u'グ', u'げ':u'ゲ', u'ご':u'ゴ'
, u'ざ':u'ザ', u'じ':u'ジ', u'ず':u'ズ', u'ぜ':u'ゼ', u'ぞ':u'ゾ'
, u'だ':u'ダ', u'ぢ':u'ヂ', u'づ':u'ヅ', u'で':u'デ', u'ど':u'ド'
, u'ば':u'バ', u'び':u'ビ', u'ぶ':u'ブ', u'べ':u'ベ', u'ぼ':u'ボ'
, u'ぱ':u'パ', u'ぴ':u'ピ', u'ぷ':u'プ', u'ぺ':u'ペ', u'ぽ':u'ポ'
, u'ヴ':u'ヴ' #2012-01-19 'ヴ'を見付け追加
, u'を':u'ヲ' , u'ー':u'ー'}

## 12.半角算用数字 ⇒ 全角算用数字 辞書 ##
num2zen = {'0':u'0', '1':u'1', '2':u'2', '3':u'3', '4':u'4'
,'5':u'5', '6':u'6', '7':u'7', '8':u'8', '9':u'9'}
## 13.全角算用数字 ⇒ 半角算用数字 辞書 ##
num2han = {u'0':'0', u'1':'1', u'2':'2', u'3':'3', u'4':'4'
, u'5':'5', u'6':'6', u'7':'7', u'8':'8', u'9':'9'}

## 14.半角算用数字 ⇒ 普通の漢数字 辞書 ##
num2knm = {'0':u'〇', '1':u'一', '2':u'二', '3':u'三', '4':u'四'
, '5':u'五', '6':u'六', '7':u'七', '8':u'八', '9':u'九'}
## 15.普通の漢数字 ⇒ 半角算用数字 辞書 ##
knm2num = {u'〇':'0', u'一':'1', u'二':'2', u'三':'3', u'四':'4'
, u'五':'5', u'六':'6', u'七':'7', u'八':'8', u'九':'9'}

## 16.半角算用数字 ⇒ 大字表記数字 辞書 ##
num2dai = {'0':u'〇', '1':u'壱', '2':u'弐', '3':u'参', '4':u'四'
, '5':u'五', '6':u'六', '7':u'七', '8':u'八', '9':u'九'}
## 17.大字表記数字 ⇒ 半角算用数字 辞書 ##
dai2num = {u'〇':'0', u'壱':'1', u'弐':'2', u'参':'3', u'四':'4'
, u'五':'5', u'六':'6', u'七':'7', u'八':'8', u'九':'9'
#日本の旧大字
, u'零':'0', u'壹':'1', u'貮':'2', u'貳':'2', u'參':'3'
, u'肆':'4', u'伍':'5', u'陸':'6', u'柒':'7', u'漆':'7'
, u'質':'7', u'捌':'8', u'玖':'9'
#中国の大字
, u'零':'0', u'壹':'1', u'贰':'2', u'貳':'2', u'叁':'3'
, u'參':'3', u'肆':'4', u'伍':'5', u'陆':'6', u'陸':'6'
, u'柒':'7', u'柒':'7', u'漆':'7', u'捌':'8', u'玖':'9'}

## 18.普通の漢数字 ⇒ 大字表記数字 辞書 ##
knm2dai = {u'一':u'壱', u'二':u'弐', u'三':u'参', u'十':u'拾'}
## 19.大字表記数字 ⇒ 普通の漢数字 辞書 ##
dai2knm = {u'壱':u'一', u'弐':u'二', u'参':u'三', u'拾':u'十'
#日本の旧大字
, u'零':u'〇', u'壹':u'一', u'貮':u'二', u'貳':u'二', u'參':u'三'
, u'肆':u'四', u'伍':u'五', u'陸':u'六', u'柒':u'七', u'漆':u'七'
, u'質':u'七', u'捌':u'八', u'玖':u'九'
#中国の大字
, u'零':u'〇', u'壹':u'一', u'贰':u'二', u'貳':u'二', u'叁':u'三'
, u'參':u'三', u'肆':u'四', u'伍':u'五', u'陆':u'六', u'陸':u'六'
, u'柒':u'七', u'柒':u'七', u'漆':u'七', u'捌':u'八', u'玖':u'九'}

# if not my_dic=={}: #不要 clean up 2012-01-25
# mode = 'my_dic' #不要 clean up 2012-01-25
# conv_dic={} #不要 clean up 2012-01-25

## ¥(asciiのバックスラッシュを全角の円マーク以外と対応) ##
if yen==None: #Noneの指定なら、処理から除外
if '\\' in han2zen:
del han2zen['\\']
if '\\' in asc2zen:
del asc2zen['\\']
if u'¥' in zen2han:
del zen2han[u'¥']
if u'¥' in zen2asc:
del zen2asc[u'¥']
if u'\' in zen2han:
del zen2han[u'\']
if u'\' in zen2asc:
del zen2asc[u'\']
elif not yen==u'¥': #u'¥'以外の指定なら、それを対象に
han2zen['\\'] = yen
asc2zen['\\'] = yen
han2zen[u'¥'] = yen # 文中のu'¥'も指定文字へ変更
asc2zen[u'¥'] = yen

zen2han[yen] = '\\'
zen2asc[yen] = '\\'

## モード設定により辞書を選択 ##
md = mode.lower() #文字列を小文字でmode判定 2012-01-14
# daku = [u'゛', u'゜', u'゙', u'゚'] #濁点、半濁点リスト # 昇順化で完全不要 clean up
if not my_dic=={}: #my_dic指定時は
conv_dic = my_dic # my_dic指定の辞書を置替辞書に
elif (md == None #99.モードをNoneとすることで空辞書指定を可能に
or md == 'none'):
conv_dic = {}
##############################################################################
# elif md == 'han2kata': # 1.半角カタカナを全角カタカナへ(既定値)
# conv_dic = han2kata
# elif md == 'kata2han': # 2.全角カタカナを半角カタカナへ
# conv_dic = kata2han
# elif md == 'han2hira': # 3.半角カタカナを全角ひらがなへ
# conv_dic = han2hira
# elif md == 'hira2han': # 4.全角ひらがなを半角カタカナへ
# conv_dic = hira2han
# elif md == 'asc2zen': # 5.半角英数記号を全角英数記号へ
# conv_dic = asc2zen
# elif md == 'zen2asc': # 6.全角英数記号を半角英数記号へ
# conv_dic = zen2asc
# elif md == 'han2zen': # 7.半角カタカナ英数記号を全角へ
# conv_dic = han2zen
# elif md == 'zen2han': # 8.全角仮名文字英数記号を半角へ
# conv_dic = zen2han
# elif md == 'kata2hira': # 9.全角カタカナを全角ひらがなへ
# conv_dic = kata2hira
# elif md == 'hira2kata': #10.全角ひらがなを全角カタカナへ
# conv_dic = hira2kata
# elif md == 'kana2han': #11.全角平片仮名を半角カタカナへ
# conv_dic = kana2han
# elif md == 'kana2han': #11.全角平片仮名を半角カタカナへ
# conv_dic = kana2han
########## 指定の置替辞書を示す文字列と同名の変数にeval()で対応 2012-01-25 ##########
else:
#print '####', md
try:
conv_dic = eval(md)
except:
##############################################################################
conv_dic = han2kata # 1.半角カタカナを全角カタカナへ(既定値)

## 辞書の修正 ##
if not alt_dic=={}: #辞書要素があるなら
for key in alt_dic: # それらを置替辞書conv_dicに追加
conv_dic[key] = alt_dic[key]
if not len(del_list)==0: #除外リストに要素があるなら
for del_key in del_list: # それらが
if del_key in conv_dic: # 置替辞書conv_dicにあるなら
del conv_dic[del_key] # 除外

if not len(pass_list)==0: #除外リストに要素があるなら 2012-01-24
for pass_key in pass_list: # それらを置替辞書conv_dicに
conv_dic[pass_key] = pass_key # キーと同じ値で追加


## 文字列の先頭からの処理の為の頭文字別の辞書を作成 ##
key_dic={} #{u'カ':[u'カ', u'カ゛']}の様な辞書を作成
key_len_dic={}
for key in conv_dic:
if key[0] in key_dic:
key_dic[key[0]].append(key)
else:
key_dic[key[0]] = [key]
if key[0] in key_len_dic:
key_len_dic[key[0]].append(len(key))
else:
key_len_dic[key[0]] = [len(key)]
for k in key_dic: #作成した頭文字別のキー辞書の中身を
key_dic[k].sort() # 整列した上で
key_dic[k].reverse() # 逆順に。長いものからcheckする様に
for k in key_len_dic:
key_len_dic[k]=list(set(key_len_dic[k]))
key_len_dic[k].sort()
key_len_dic[k].reverse()

if debug ==11: # 11のときのみ以下のdebug出力
print key_len_dic
## 正順比較での置替文字列の作成 ##
o = u'%s' % (unicode(s)) #
z = u'' #処理文字追記用文字列変数の初期化
end = len(o) #文字列の長さを取得
i = 0 #文字開始位置のアドレス
while i1: # keyの文字列が1字以上なら後置文字有りなので
# suffixes.append(key[1:])# 後置文字をそのリストに追加
# suffixes = set(suffixes)
# daku = suffixes #
# if debug>10:
# print 'DEBUG:conv_dic = %s' % (prn_seq(conv_dic))
# ## debug時の表示 ##
# if debug>0: #debugモードでは
# if suf_len>1:
# print u'2文字より大きい置換文字の定義があります。未対応です。'
# conv_ks = conv_dic.keys() # 指定置替辞書のキーを取得し
# conv_ks.sort() # それを文字コード順に並べ替え
# for i in range(10): # 10個をその順でキーと値を標準出力
# print u'%s ⇒ %s' % (
# conv_ks[20+i] #2012-01-13 uを追加補正
# ,conv_dic[conv_ks[20+i]]),
# print
# if debug==10:
# print u'daku = %s' % (prn_seq(daku))

# ## 置替文字列の作成 ##
#####################################################################
#  全て置替用辞書に依存し置替する仕組み。以下は濁点・半濁点の判別の為、逆順の
# 文字列を使って処理後、再度逆順にする手法を用いていた0.1.2a。
#
# # カナの半角全角置替で注意すべきは濁点/半濁点が1文字として常に独立するかどうだ。
# #その処理をutf-8でコーディングするには、先ず文字列を確実にunicode化し反転させ
# #一文字ずつ取出し、濁点/半濁点が確認されたときには、処理を保留し次の文字が、
# #同じく濁点/半濁点だったら、濁点/半濁点の連続として前の濁点/半濁点の文字を書出し
# #そうでなかったら、前の濁点/半濁点の文字とくっ付けた文字列が置替候補にないかを
# #見て、そうなら、その置替文字を書出し、そうでないなら、前の濁点/半濁点を単独置替した
# #ものを書出し濁点/半濁点でなかった文字の置替文字を書出す。
# #辞書にない文字なら、前が濁点/半濁点なら単独置替で書出しから辞書になかった文字を書出し
# #最後に書き出した文字列を反転し元に戻して値を返す。
# o = reverse(o) # 濁音半濁音処理の為お尻から処理したいので
# # Unicode文字として並びを反転した上で
# z = p = u'' # 処理用文字列初期化(z=置替後文字列)
# for h in o: # 文字列を1文字ずつ取出し
# is_dakus = False
# if debug==10:
# print 'p=\'%s\', h=\'%s\'' % (p, h)
# if h in conv_dic: # それが辞書にある文字で
# if h in daku: # 濁点、半濁点で
# if p in daku: # ひとつ前もそうだったなら
# k = u'%s%s' % (h, p) # 先ずは前のもの(半/濁点)と
# # その文字をくっ付けたものが
# if k in conv_dic: # 置替辞書(alt_dicでの指定分)
# # にあったら
# z += reverse( #
# conv_dic[k]) # その文字に置替し追加
# p = u'' # 使用済ということで濁点としない
# is_dakus = True #
# if p in conv_dic: # 辞書にあるなら
# z += reverse(
# conv_dic[p]) # 前のものを全角の半/濁点に置替し追加
# p = u'%s' % (h)
# else: # 辞書になかったら
# z += p # そのまま追加
# p = u'%s' % (h) # その文字をpで一つ前の文字として記憶
# else: # 濁点、半濁点でなかったら
# k = u'%s%s' % (h, p) # 前のもの(半/濁点)と
# # その文字をくっ付けたものが
# if k in conv_dic: # 濁点、半濁点付の候補であれば
# z += reverse(conv_dic[k])# その文字に置替し追加
# if debug==10:
# print '',
# print k, conv_dic[k]
# else: # そうでないなら、仕方ないので
# z += reverse(conv_dic[p])# 変換後の濁点、半濁点に変換
# z += reverse(conv_dic[h])# 辞書で全角に置替し文字列追加
# p = u'' # 処理済のpの記憶を消去し通常モードに
# else: # 逆にそれが辞書にない文字で
# if h in daku:
# if p in conv_dic:
# z += reverse(conv_dic[p])
# else:
# z += p
# p=u'%s' % (h)
# else:
# if not p == u'': # pに記憶があり
# k = u'%s%s' % (h, p)
# if k in conv_dic: # 濁点、半濁点付の候補であれば
# z += reverse(
# conv_dic[h+p]) # その文字に置替し追加
# p = u''
# else: # そうでないなら、仕方ないので
# z += p
# z += h
# p = u'' # 処理済のpの記憶を消去し通常モードに
# else:
# z += h # そのままの文字を追加
# p = u''
#
# if h in daku and not is_dakus:
# p = u'%s' % (h)
# else:
# p = u''
# return reverse(z) # 作成した文字列を文字単位で反転し
# # その処理後の文字列を返す
##############################################################################


def prn_seq(sequence):
u"""
Python2.x系でlist, tuple, mapといったシーケンス系の型を直接printすると
unocode文字列が16進数表記となってしまい何のことやら読めなくなってしまう。
この関数は、その不便さを解消する為のものである。
 但し、現時点の実装は文字列と数字のみの要素迄。
"""
from types import TupleType, ListType, DictType, StringType, UnicodeType
from types import IntType, LongType, FloatType
fmt_typ_dic = {StringType:u'\'%s\'', UnicodeType:u'u\'%s\''
, IntType:u'%d', LongType:u'%d', FloatType:u'%f'}
fmt_str_dic = {TupleType:u'(%s)', ListType:u'[%s]'
, DictType:u'{%s}', type(set([])):u'[%s]'}
fmt_str = fmt_str_dic[type(sequence)]
l = []
if type(sequence)==DictType:
for s in sequence:
fmt_str= u'%s:%s' % (fmt_typ_dic[type(s)], fmt_typ_dic[type(sequence[s])])
l.append(fmt_str % (s, sequence[s]))
else:
for s in sequence:
l.append(fmt_typ_dic[type(s)] % (s))
return fmt_str_dic[type(sequence)] % (', '.join(l))


def diff(a, b):
u"""行別差分表示関数"""
from difflib import Differ
before = a.splitlines(1)
after = b.splitlines(1)
d = Differ()
p = 0
for s in d.compare(before, after):
if not (s[0]==' ' or s[0]=='?'):
if s[0]=='+': p = 1
else:
if p==1: print #ブロック毎で空白行を作る
p = 0
print s,

def _test(debug=1):
u"""
zen_conv()の処理テスト用関数
"""
test = u"""
全角片仮名:アイウエオ、パピュプョペェポォ、ヴィー
全角平仮名:あいうえお、半 角 片 仮 名:アイウエオ、濁点重複:バ゙ビ゙
濁点平仮名:がぎくげご、濁点半角片仮名:ガギグゲゴ 、ヴィー
半濁平仮名:ぱぴぷぺぼ、半濁半角片仮名:パピプペポ
漢数字: 「金一拾二億三千四百五拾六万七千八百九拾円」、〇、廿
大字: 「金壱千万弐千参拾四円」、壹貮參肆伍陸柒捌玖
全角英数記号: 1234567890,abc,ABC,#$%¥ , → ⇒ ÷
半角英数記号: 1234567890, abc, ABC, #$%\\ ,-> => /
"""
print __doc__
print 'orignal text'
print 'testに次の様に文字列を代入し'
print '>>> test=u\"\"\"%s\"\"\"' % (test)
mode_names={ 'han2kata' :u'# 1.半角カナを全角カタカナへ'
, 'kata2han' :u'# 2.全角カタカナを半角カナへ'
, 'han2hira' :u'# 3.半角カタカナを全角ひらがなへ'
, 'hira2han' :u'# 4.全角ひらがなを半角カナへ'

, 'asc2zen' :u'# 5.半角英数記号を全角へ'
, 'zen2asc' :u'# 6.全角英数記号を半角へ'
, 'han2zen' :u'# 7.半角カナ英数記号を全角へ'
, 'zen2han' :u'# 8.全角仮名英数記号を半角へ'

, 'kata2hira':u'# 9.全角カタカナを全角ひらがなへ'
, 'hira2kata':u'#10.全角ひらがなを全角カタカナへ'
, 'kana2han' :u'#11.全角かなを半角カナへ'

, 'num2zen' :u'#12.半角算用数字を全角算用数字へ'
, 'num2han' :u'#13.全角算用数字を半角算用数字へ'
, 'num2knm' :u'#14.半角算用数字を普通の漢数字へ'
, 'knm2num' :u'#15.普通の漢数字を半角算用数字へ'

, 'num2dai' :u'#16.半角算用数字を大字表記数字へ'
, 'dai2num' :u'#17.大字表記数字を半角算用数字へ'

, 'knm2dai' :u'#18.普通の漢数字を大字表記数字へ'
, 'dai2knm' :u'#19.大字表記数字を普通の漢数字へ'
}
modes=[ 'han2kata', 'kata2han', 'han2hira', 'hira2han'
, 'asc2zen', 'zen2asc', 'zen2han', 'han2zen'
, 'kata2hira', 'hira2kata', 'kana2han'
, 'num2zen', 'num2han', 'num2knm', 'knm2num'
, 'num2dai', 'dai2num', 'knm2dai', 'dai2knm'
]
n = 1
#全modeでtest文字列を変換
for m in modes:
print
print u'%3d%sの変換は' % (n, mode_names[m][3:])
print '>>> zen_conv(test, mode=\'%s\', debug=1)' % (m)
diff(test, zen_conv(test, mode=m, debug=1))
n += 1
#英数記号を含むmodeで「¥」を「\」で処理
ascmodes=['zen2han','han2zen', 'asc2zen', 'zen2asc']
for m in ascmodes:
print
print u'%3d%sの変換でyen=u\'\\'とすると' % (n, mode_names[m][3:])
print u'>>> zen_conv(test, mode=\'%s\', yen=u\'\\', debug=1)' % (m)
print zen_conv(test, mode=m, yen=u'\', debug=1)
n += 1
#英数記号を含むmodeで「¥」や「\」の処理を外す
for m in ascmodes:
print
print u'%3d%sの変換でyen=Noneとすると' % (n, mode_names[m][3:])
print u'>>> zen_conv(test, mode=\'%s\', yen=None, debug=1)' % (m)
print zen_conv(test, mode=m, yen=None, debug=1)
n += 1
m = 'kata2han'
print u'%3d%sの変換でdel_list=[u\'パ\', u\'プ\']とすると' % (n, mode_names[m][3:])
print u'>>> zen_conv(test, mode=\'%s\', del_list=[u\'パ\', u\'プ\'], debug=1)' % (m)
print zen_conv(test, mode=m, del_list=[u'パ', u'プ'], debug=1)
n += 1
m = 'kata2han'
print u'%3d%sの変換でalt_dic={u\'パ\':u\'パ\', u\'->\':u\'→\'}, del_list=[u\'パ\', u\'プ\']とすると' % (n, mode_names[m][3:])
print u'>>> zen_conv(test, mode=\'%s\', alt_dic={u\'パ\':u\'パ\', u\'->\':u\'→\'}, del_list=[u\'パ\', u\'プ\'], debug=0)' % (m)
print zen_conv(test, mode=m
, alt_dic={u'->':u'→', u'パ':u'パ'}
, del_list=[u'パ', u'プ']
, debug=0)
n += 1

def _test2():
u"""
モード名関数のテスト用関数
"""
test = u'''半角片仮名 : アカサタナハマヤラワ ガジヅベポ ヴィ
全角片仮名 : アカサタナハマヤラワ ガジヅベポ ヴィ
全角平仮名 : あかさたなはまやらわ がじづべぽ ヴぃ
半角英数記号: 012<-+-*/->
全角英数記号: 012←+−×÷→
'''
print u'''>>> test = u\'\'\'半角片仮名 : アカサタナハマヤラワ ガジヅベポ ヴィ
全角片仮名 : アカサタナハマヤラワ ガジヅベポ ヴィ
全角平仮名 : あかさたなはまやらわ がじづべぽ ヴぃ
半角英数記号: 012<-+-*/->
全角英数記号: 012←+−×÷→
\'\'\''''
print u'\n# 1.半角カタカナを全角カタカナへ'
print '>>> han2kata(test)'
print han2kata(test)
print u'\n# 2.全角カタカナを半角カタカナへ'
print '>>> kata2han(test)'
print kata2han(test)

print u'# 3.半角カタカナを全角ひらがなへ'
print '>>> han2hira(test)'
print han2hira(test)
print u'\n# 4.全角ひらがなを半角カタカナへ'
print '>>> hira2han(test)'
print hira2han(test)

print u'\n# 5.半角英数記号を全角英数記号へ'
print '>>> asc2zen(test)'
print asc2zen(test)
print u'\n# 6.全角英数記号を半角英数記号へ'
print '>>> zen2asc(test)'
print zen2asc(test)

print u'\n# 7.半角カタカナ英数記号を全角へ'
print '>>> han2zen(test)'
print han2zen(test)
print u'\n# 8.全角仮名文字英数記号を半角へ'
print '>>> zen2han(test)'
print zen2han(test)

print u'\n# 9.全角カタカナを全角ひらがなへ'
print '>>> kata2hira(test)'
print kata2hira(test)
print u'\n#10.全角ひらがなを全角カタカナへ'
print '>>> hira2kata(test)'
print hira2kata(test)

print u'\n#11.全角平片仮名を半角カタカナへ'
print '>>> kana2han(test)'
print kana2han(test)

print u'\n#12.半角英数記号を全角へ&演算子矢印置替追加'
print '>>> asc2zen(test, alt_dic={\'+\':u\'+\', \'-\':u\'−\', \'*\':u\'×\', \'/\':u\'÷\', \'<-\':u\'←\', \'->\':u\'→\'})'
print asc2zen(test, alt_dic={'+':u'+', '-':u'−'
, '*':u'×', '/':u'÷'
, '<-':u'←', '->':u'→'}
, debug=1)

print u'\n#13.半角英数記号を全角へ&数字除外'
print '>>> asc2zen(test, alt_dic={\'+\':u\'+\', \'-\':u\'−\', \'*\':u\'×\', \'/\':u\'÷\', \'<-\':u\'←\', \'->\':u\'→\'})'
print asc2zen(test, del_list=['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'], debug=1)

print u'\n#13.半角英数記号を全角へ&数字除外'
print '>>> asc2zen(test, alt_dic={\'+\':u\'+\', \'-\':u\'−\', \'*\':u\'×\', \'/\':u\'÷\', \'<-\':u\'←\', \'->\':u\'→\'})'
print asc2zen(test, del_list=['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'], debug=1)

def _test3():
knum = { u'億弐百参万四千':102034000
, u'壱億弐百参万四千':102034000
, u'壱億弐百参万四千五':102034005
, u'一二三四五':12345
, u'一二三四万五千':12345000
, u'一二億三四万五千':1200345000
, u'千':1000}
for i in knum:
ans = str2int(i)
if ans == knum[i]:
r = u'='
else:
r = u'≠'
print u'%14d %s %s' % (ans, r, i)

def _test4():
test = u"""
漢数字: 「金一拾二億三千四百五拾六万七千八百九拾円」、〇、廿
大字: 「金壱千万弐千参拾四円」、壹貮參肆伍陸柒捌玖
全角英数記号: 1234567890,abc,ABC,#$%¥ , → ⇒ ÷
半角英数記号: 1234567890, abc, ABC, #$%\\ ,-> => /
"""
print all2int(test)

if __name__ == '__main__':
#_test()
_test2()
続きを読む
posted by Mire at 14:26 | Comment(1) | TrackBack(0) | Pythonプログラミング | このブログの読者になる | 更新情報をチェックする

2012年01月17日

【Unicode】PythonでのUnicode下での半角カナと全角かな変換(2)

 2010年05月05日記載の「【Unicode】PythonでのUnicode下での半角カナと全角かな変換」で公開したコードに対し、先日以下の様なコメントを頂いた。

こんにちは。

実際に使わせていただいたものです。お世話になってます。
u'ケ':u'お'
u'ケ' :u'お'
u'お' :u'ケ'←こんな感じで、ケのところが おに変わってしまったりするので、修正された方がいいかと思い、コメントいたしました。
Posted by 通りすがり at 2012年01月05日 19:48


 取り敢えず、ご指摘頂いたところに修正を加えさせて頂いた次第だが、修正後のコードを実行して試みるとエラーが出るのでさらに手直しをして行くと、作成当時の状況を少しずつ思い出したところだ。コードとしては、自己の一つの需要に応える為に作ったものを元に簡単にPythonで半角全角の文字置替えるコーディング方法を提示しておこうとの思いで掲載した程度のもので即座に完成形を提供しようと迄の思いのものではなかった。
 でも、そんな姿勢はオープンソースの視点で言うと互いにソースを公開することで誰かが作ってみんなが自由に活用するというメリットを軽視したものであったと今回改めて反省した次第だ。
 と言うことで、今回、いい加減な状態で中断していた同コードを読み易く見直し、ちゃんと動作する様にすると共に、変換モードを追加させて頂き、ここに公開することにさせて頂いた。

 ただ、残念ながら以前のコードは成り行きで出来上がったものであって、変数や処理記載の順番もいい加減、カプセル化の為のmode名も頭での整理が不充分な内での命名だった為、今回のコードでは改めて命名規則を決めた上で全面的に見直させて頂いた。結果として以前のモード値と今回公開のコード上のモード値に互換が無くなってしまった。もし以前のコードを修正して利用しているものについては、そのまま利用頂き、今回のコードについては新規利用分より活用頂くことを推奨させて頂くことにする。しかし、既に利用中のものを今回のコードに置き替えたいなら次のリストに従いmode値を置き替えると良いだろう。但し、7〜10は新設のモードでありJISコードにあるascii文字と重複する全角の英数記号を変換対象に加えたものである。関数名からするとカテゴリ外の機能を追加したので関数名も zen_conv() に改称させて頂いた。

0.半角カタカナを全角ひらがなへ hira → han2hira
1.全角カタカナを全角ひらがなへ zkata2hira → kata2hira
2.全角ひらがなを全角カタカナへ zhira2kata → hira2kata
3.全角ひらがなを半角カナへ zhira2han → hira2han
4.全角カタカナを半角カナへ zkana2han → kata2han
5.全角平片カナを半角カナへ zkana2han → kana2han
6.半角カタカナを全角カタカナへ (既定値) → han2kata(既定値)
7.全角ひらがな+全角カタカナ+全角英数記号を半角へ → zen2han
8.半角ひらがな+全角カタカナ+全角英数記号を全角へ → han2zen
9.半角英数記号を全角へ → asc2zen
10.全角英数記号を半角へ → zen2asc


 尚、以前のコードについては一部機能していないモードがあるが、今回はその点も新たなモード名で全て機能する様にしたつもりだ。ただ作成にあたってはパターンでコピペして作製しているので不具合を抱えがちである。そこで不充分ながらも文字列testに対し全モードをテストする関数を附記している。実行結果は次の通りだが、これだけで総てのチェックが出来る訳でもないので何か不具合があれば、ご指摘頂けるととても有難い。





[mire@localhost ~]$ python jpcode.py

######################################################################
# 1. reverse(s) : Unicode文字列用の降順並替
# 2. sort(s) : Unicode文字列用の昇順並替
# 3. zen_conv( s : 文字列s内の半角/全角カナASCII文字の変換
# , mode : 'han2hira' = 0.半角カタカナを全角ひらがなへ
# : 'kata2hira' = 1.全角カタカナを全角ひらがなへ
# : 'hira2kata' = 2.全角ひらがなを全角カタカナへ
# : 'hira2han' = 3.全角ひらがなを半角カナへ
# : 'kata2han' = 4.全角カタカナを半角カナへ
# : 'kana2han' = 5.全角平片カナを半角カナへ
# : 'han2kata' = 6.半角カタカナを全角カタカナへ(既定値)
# : 'zen2han' = 7.全角カタカナ+ひらがな+英数記号を半角へ
# : 'han2zen' = 8.半角カタカナ+全角英数記号を全角へ
# : 'asc2zen' = 9.半角英数記号を全角へ
# : 'zen2asc' =10.全角英数記号を半角へ
# , yen : 「\」を「¥」(既定値)以外で変換したい文字列を指定
# , alt_dic : 変換辞書へmap修正追加するものを辞書で指定
# , del_list: 変換辞書から除去する文字をlistで指定
# , my_dic : 固有の変換辞書を指定
# , debug) : 固有の変換辞書を指定
# modeの命名規則 : 全角ひらがな=hira, 全角カタカナ=kata, 半角=han, 全角=zen
# : ' to '='2', 半角英数記号(ascii)=asc
#  全て変換用辞書に依存し変換する仕組み。濁点・半濁点の判別の為、逆順の
# 文字列を使って処理後、再度逆順にする手法を用いている。
#【更新履歴】
# 2010-05-05 0.0.0  kana2zen()として半角カナを全角のカタカナひらがなへの
# 変換機能及び、そのテストコードを公開
# 2010-05-06 0.0.1  半角への逆変換が欲しくなったので機能拡張し、kana_conv()
# としたdebug時に参照辞書の一部を確認可能にし、指定ミスを
# 発見し易くした長音記号等漏れ等の誤りを補正。多分精度的には
# まだα1クラス。
# 2012-01-13 0.0.1a  通りすがりさんご指摘の'け''ケ'のマッピングミスを修正
# 2012-01-14 0.0.2  この__DOC__のmode名hiraをhan2hiraに変更、その他も改変
# ※0.0.1a以前と非互換。今後は新命名規則でmode名を決定
# 2012-01-15 0.1.0  全角英数記号文字の半角変換をzen2han、その逆をhan2zen
# として追加半角英数記号の全角変換をasc2zen、その逆をzen2asc
# として追加し、関数名をzen_conv()に変更
# 2012-01-16 0.1.0a  引数 yen, alt_dic, del_list, my_dic を追加し個別用途の
# 変換需要に応える様に拡張開始
#
#【判っている課題】
# 2012-01-17 alt_dicで追加したものに濁点半濁点がうまく処理出来ない場合がある。
# my_dic 利用の成否は未確認。

orignal text
testに次の様に文字列を代入し
>>> test=u"""
全角片仮名:アイウエオ、パピュプョペェポォ
全角平仮名:あいうえお、半角片仮名アイウエオ、
濁点平仮名:がぎくげご、濁点半角片仮名ガギグゲゴ
半濁平仮名:ぱぴぷぺぼ、半濁半角片仮名パピプペポ
濁点重複:バ゙ビ゙
ヴィー、ヴィー
全角英数記号: 012,abc,ABC,#$%¥
半角英数記号: 012,abc,ABC,#$%\
"""

0.半角カタカナを全角ひらがなへの変換は
>>> zen_conv(test, mode='han2hira', debug=1)
カ ⇒ か ガ ⇒ が キ ⇒ き ギ ⇒ ぎ ク ⇒ く グ ⇒ ぐ ケ ⇒ け ゲ ⇒ げ コ ⇒ こ ゴ ⇒ ご

全角片仮名:アイウエオ、パピュプョペェポォ
全角平仮名:あいうえお、半角片仮名あいうえお、
濁点平仮名:がぎくげご、濁点半角片仮名がぎぐげご
半濁平仮名:ぱぴぷぺぼ、半濁半角片仮名ぱぴぷぺぽ
濁点重複:ば゛び゛
ヴィー、う゛ぃー
全角英数記号: 012,abc,ABC,#$%¥
半角英数記号: 012,abc,ABC,#$%\


1.全角カタカナを全角ひらがなへの変換は
>>> zen_conv(test, mode='kata2hira', debug=1)
コ ⇒ こ ゴ ⇒ ご サ ⇒ さ ザ ⇒ ざ シ ⇒ し ジ ⇒ じ ス ⇒ す ズ ⇒ ず セ ⇒ せ ゼ ⇒ ぜ

全角片仮名:あいうえお、ぱぴゅぷょぺぇぽぉ
全角平仮名:あいうえお、半角片仮名アイウエオ、
濁点平仮名:がぎくげご、濁点半角片仮名ガギグゲゴ
半濁平仮名:ぱぴぷぺぼ、半濁半角片仮名パピプペポ
濁点重複:バ゙ビ゙
う゛ぃー、ヴィー
全角英数記号: 012,abc,ABC,#$%¥
半角英数記号: 012,abc,ABC,#$%\


2.全角ひらがなを全角カタカナへの変換は
>>> zen_conv(test, mode='hira2kata', debug=1)
ご ⇒ ゴ さ ⇒ サ ざ ⇒ ザ し ⇒ シ じ ⇒ ジ す ⇒ ス ず ⇒ ズ せ ⇒ セ ぜ ⇒ ゼ そ ⇒ ソ

全角片仮名:アイウエオ、パピュプョペェポォ
全角平仮名:アイウエオ、半角片仮名アイウエオ、
濁点平仮名:ガギクゲゴ、濁点半角片仮名ガギグゲゴ
半濁平仮名:パピプペボ、半濁半角片仮名パピプペポ
濁点重複:バ゙ビ゙
ヴィー、ヴィー
全角英数記号: 012,abc,ABC,#$%¥
半角英数記号: 012,abc,ABC,#$%\


3.全角ひらがなを半角カナへの変換は
>>> zen_conv(test, mode='hira2han', debug=1)
け ⇒ ケ げ ⇒ ゲ こ ⇒ コ ご ⇒ ゴ さ ⇒ サ ざ ⇒ ザ し ⇒ シ じ ⇒ ジ す ⇒ ス ず ⇒ ズ

全角片仮名:アイウエオ、パピュプョペェポォ
全角平仮名:アイウエオ、半角片仮名アイウエオ、
濁点平仮名:ガギクゲゴ、濁点半角片仮名ガギグゲゴ
半濁平仮名:パピプペボ、半濁半角片仮名パピプペポ
濁点重複:バ゙ビ゙
ヴィー、ヴィー
全角英数記号: 012,abc,ABC,#$%¥
半角英数記号: 012,abc,ABC,#$%\


4.全角カタカナを半角カナへの変換は
>>> zen_conv(test, mode='kata2han', debug=1)
ク ⇒ ク グ ⇒ グ ケ ⇒ ケ ゲ ⇒ ゲ コ ⇒ コ ゴ ⇒ ゴ サ ⇒ サ ザ ⇒ ザ シ ⇒ シ ジ ⇒ ジ

全角片仮名:アイウエケ、バピュプョペェポォ
全角平仮名:あいうえお、半角片仮名アイウエオ、
濁点平仮名:がぎくげご、濁点半角片仮名ガギグゲゴ
半濁平仮名:ぱぴぷぺぼ、半濁半角片仮名パピプペポ
濁点重複:バ゙ビ゙
ヴィー、ヴィー
全角英数記号: 012,abc,ABC,#$%¥
半角英数記号: 012,abc,ABC,#$%\


5.全角かなを半角カナへの変換は
>>> zen_conv(test, mode='kana2han', debug=1)
け ⇒ ケ げ ⇒ ゲ こ ⇒ コ ご ⇒ ゴ さ ⇒ サ ざ ⇒ ザ し ⇒ シ じ ⇒ ジ す ⇒ ス ず ⇒ ズ

全角片仮名:アイウエケ、バピュプョペェポォ
全角平仮名:アイウエオ、半角片仮名アイウエオ、
濁点平仮名:ガギクゲゴ、濁点半角片仮名ガギグゲゴ
半濁平仮名:パピプペボ、半濁半角片仮名パピプペポ
濁点重複:バ゙ビ゙
ヴィー、ヴィー
全角英数記号: 012,abc,ABC,#$%¥
半角英数記号: 012,abc,ABC,#$%\


6.半角カナを全角カタカナへの変換は
>>> zen_conv(test, mode='han2kata', debug=1)
オ ⇒ オ カ ⇒ カ ガ ⇒ ガ キ ⇒ キ ギ ⇒ ギ ク ⇒ ク グ ⇒ グ ケ ⇒ ケ ゲ ⇒ ゲ コ ⇒ コ

全角片仮名:アイウエオ、パピュプョペェポォ
全角平仮名:あいうえお、半角片仮名アイウエオ、
濁点平仮名:がぎくげご、濁点半角片仮名ガギグゲゴ
半濁平仮名:ぱぴぷぺぼ、半濁半角片仮名パピプペポ
濁点重複:バ゛ビ゛
ヴィー、ヴィー
全角英数記号: 012,abc,ABC,#$%¥
半角英数記号: 012,abc,ABC,#$%\


7.全角仮名英数記号を半角への変換は
>>> zen_conv(test, mode='zen2han', debug=1)
ぎ ⇒ ギ く ⇒ ク ぐ ⇒ グ け ⇒ ケ げ ⇒ ゲ こ ⇒ コ ご ⇒ ゴ さ ⇒ サ ざ ⇒ ザ し ⇒ シ

全角片仮名:アイウエケ、バピュプョペェポォ
全角平仮名:アイウエオ、半角片仮名アイウエオ、
濁点平仮名:ガギクゲゴ、濁点半角片仮名ガギグゲゴ
半濁平仮名:パピプペボ、半濁半角片仮名パピプペポ
濁点重複:バ゙ビ゙
ヴィー、ヴィー
全角英数記号: 012,abc,ABC,#$%\
半角英数記号: 012,abc,ABC,#$%\


8.半角カナ英数記号を全角への変換は
>>> zen_conv(test, mode='han2zen', debug=1)
5 ⇒ 5 6 ⇒ 6 7 ⇒ 7 8 ⇒ 8 9 ⇒ 9 : ⇒ : ; ⇒ ; < ⇒ < = ⇒ = > ⇒ >

全角片仮名:アイウエオ、パピュプョペェポォ
全角平仮名:あいうえお、半角片仮名アイウエオ、
濁点平仮名:がぎくげご、濁点半角片仮名ガギグゲゴ
半濁平仮名:ぱぴぷぺぼ、半濁半角片仮名パピプペポ
濁点重複:バ゛ビ゛
ヴィー、ヴィー
全角英数記号: 012,abc,ABC,#$%¥
半角英数記号: 012,abc,ABC,#$%¥


9.半角英数記号を全角への変換は
>>> zen_conv(test, mode='asc2zen', debug=1)
5 ⇒ 5 6 ⇒ 6 7 ⇒ 7 8 ⇒ 8 9 ⇒ 9 : ⇒ : ; ⇒ ; < ⇒ < = ⇒ = > ⇒ >

全角片仮名:アイウエオ、パピュプョペェポォ
全角平仮名:あいうえお、半角片仮名アイウエオ、
濁点平仮名:がぎくげご、濁点半角片仮名ガギグゲゴ
半濁平仮名:ぱぴぷぺぼ、半濁半角片仮名パピプペポ
濁点重複:バ゙ビ゙
ヴィー、ヴィー
全角英数記号: 012,abc,ABC,#$%¥
半角英数記号: 012,abc,ABC,#$%¥


10.全角英数記号を半角への変換は
>>> zen_conv(test, mode='zen2asc', debug=1)
4 ⇒ 4 5 ⇒ 5 6 ⇒ 6 7 ⇒ 7 8 ⇒ 8 9 ⇒ 9 : ⇒ : ; ⇒ ; < ⇒ < = ⇒ =

全角片仮名:アイウエオ、パピュプョペェポォ
全角平仮名:あいうえお、半角片仮名アイウエオ、
濁点平仮名:がぎくげご、濁点半角片仮名ガギグゲゴ
半濁平仮名:ぱぴぷぺぼ、半濁半角片仮名パピプペポ
濁点重複:バ゙ビ゙
ヴィー、ヴィー
全角英数記号: 012,abc,ABC,#$%\
半角英数記号: 012,abc,ABC,#$%\


11.全角仮名英数記号を半角への変換でyen=u'\'とすると
>>> zen_conv(test, mode='zen2han', yen=u'\', debug=1)
ぎ ⇒ ギ く ⇒ ク ぐ ⇒ グ け ⇒ ケ げ ⇒ ゲ こ ⇒ コ ご ⇒ ゴ さ ⇒ サ ざ ⇒ ザ し ⇒ シ

全角片仮名:アイウエケ、バピュプョペェポォ
全角平仮名:アイウエオ、半角片仮名アイウエオ、
濁点平仮名:ガギクゲゴ、濁点半角片仮名ガギグゲゴ
半濁平仮名:パピプペボ、半濁半角片仮名パピプペポ
濁点重複:バ゙ビ゙
ヴィー、ヴィー
全角英数記号: 012,abc,ABC,#$%\
半角英数記号: 012,abc,ABC,#$%\


12.半角カナ英数記号を全角への変換でyen=u'\'とすると
>>> zen_conv(test, mode='han2zen', yen=u'\', debug=1)
5 ⇒ 5 6 ⇒ 6 7 ⇒ 7 8 ⇒ 8 9 ⇒ 9 : ⇒ : ; ⇒ ; < ⇒ < = ⇒ = > ⇒ >

全角片仮名:アイウエオ、パピュプョペェポォ
全角平仮名:あいうえお、半角片仮名アイウエオ、
濁点平仮名:がぎくげご、濁点半角片仮名ガギグゲゴ
半濁平仮名:ぱぴぷぺぼ、半濁半角片仮名パピプペポ
濁点重複:バ゛ビ゛
ヴィー、ヴィー
全角英数記号: 012,abc,ABC,#$%\
半角英数記号: 012,abc,ABC,#$%\


13.半角英数記号を全角への変換でyen=u'\'とすると
>>> zen_conv(test, mode='asc2zen', yen=u'\', debug=1)
5 ⇒ 5 6 ⇒ 6 7 ⇒ 7 8 ⇒ 8 9 ⇒ 9 : ⇒ : ; ⇒ ; < ⇒ < = ⇒ = > ⇒ >

全角片仮名:アイウエオ、パピュプョペェポォ
全角平仮名:あいうえお、半角片仮名アイウエオ、
濁点平仮名:がぎくげご、濁点半角片仮名ガギグゲゴ
半濁平仮名:ぱぴぷぺぼ、半濁半角片仮名パピプペポ
濁点重複:バ゙ビ゙
ヴィー、ヴィー
全角英数記号: 012,abc,ABC,#$%\
半角英数記号: 012,abc,ABC,#$%\


14.全角英数記号を半角への変換でyen=u'\'とすると
>>> zen_conv(test, mode='zen2asc', yen=u'\', debug=1)
4 ⇒ 4 5 ⇒ 5 6 ⇒ 6 7 ⇒ 7 8 ⇒ 8 9 ⇒ 9 : ⇒ : ; ⇒ ; < ⇒ < = ⇒ =

全角片仮名:アイウエオ、パピュプョペェポォ
全角平仮名:あいうえお、半角片仮名アイウエオ、
濁点平仮名:がぎくげご、濁点半角片仮名ガギグゲゴ
半濁平仮名:ぱぴぷぺぼ、半濁半角片仮名パピプペポ
濁点重複:バ゙ビ゙
ヴィー、ヴィー
全角英数記号: 012,abc,ABC,#$%\
半角英数記号: 012,abc,ABC,#$%\


15.全角仮名英数記号を半角への変換でyen=Noneとすると
>>> zen_conv(test, mode='zen2han', yen=None, debug=1)
ぎ ⇒ ギ く ⇒ ク ぐ ⇒ グ け ⇒ ケ げ ⇒ ゲ こ ⇒ コ ご ⇒ ゴ さ ⇒ サ ざ ⇒ ザ し ⇒ シ

全角片仮名:アイウエケ、バピュプョペェポォ
全角平仮名:アイウエオ、半角片仮名アイウエオ、
濁点平仮名:ガギクゲゴ、濁点半角片仮名ガギグゲゴ
半濁平仮名:パピプペボ、半濁半角片仮名パピプペポ
濁点重複:バ゙ビ゙
ヴィー、ヴィー
全角英数記号: 012,abc,ABC,#$%¥
半角英数記号: 012,abc,ABC,#$%\


16.半角カナ英数記号を全角への変換でyen=Noneとすると
>>> zen_conv(test, mode='han2zen', yen=None, debug=1)
5 ⇒ 5 6 ⇒ 6 7 ⇒ 7 8 ⇒ 8 9 ⇒ 9 : ⇒ : ; ⇒ ; < ⇒ < = ⇒ = > ⇒ >

全角片仮名:アイウエオ、パピュプョペェポォ
全角平仮名:あいうえお、半角片仮名アイウエオ、
濁点平仮名:がぎくげご、濁点半角片仮名ガギグゲゴ
半濁平仮名:ぱぴぷぺぼ、半濁半角片仮名パピプペポ
濁点重複:バ゛ビ゛
ヴィー、ヴィー
全角英数記号: 012,abc,ABC,#$%¥
半角英数記号: 012,abc,ABC,#$%\


17.半角英数記号を全角への変換でyen=Noneとすると
>>> zen_conv(test, mode='asc2zen', yen=None, debug=1)
5 ⇒ 5 6 ⇒ 6 7 ⇒ 7 8 ⇒ 8 9 ⇒ 9 : ⇒ : ; ⇒ ; < ⇒ < = ⇒ = > ⇒ >

全角片仮名:アイウエオ、パピュプョペェポォ
全角平仮名:あいうえお、半角片仮名アイウエオ、
濁点平仮名:がぎくげご、濁点半角片仮名ガギグゲゴ
半濁平仮名:ぱぴぷぺぼ、半濁半角片仮名パピプペポ
濁点重複:バ゙ビ゙
ヴィー、ヴィー
全角英数記号: 012,abc,ABC,#$%¥
半角英数記号: 012,abc,ABC,#$%\


18.全角英数記号を半角への変換でyen=Noneとすると
>>> zen_conv(test, mode='zen2asc', yen=None, debug=1)
4 ⇒ 4 5 ⇒ 5 6 ⇒ 6 7 ⇒ 7 8 ⇒ 8 9 ⇒ 9 : ⇒ : ; ⇒ ; < ⇒ < = ⇒ =

全角片仮名:アイウエオ、パピュプョペェポォ
全角平仮名:あいうえお、半角片仮名アイウエオ、
濁点平仮名:がぎくげご、濁点半角片仮名ガギグゲゴ
半濁平仮名:ぱぴぷぺぼ、半濁半角片仮名パピプペポ
濁点重複:バ゙ビ゙
ヴィー、ヴィー
全角英数記号: 012,abc,ABC,#$%¥
半角英数記号: 012,abc,ABC,#$%\

19.全角カタカナを半角カナへの変換でdel_list=[u'パ', u'プ']とすると
>>> zen_conv(test, mode='kata2han', del_list=[u'パ', u'プ'], debug=1)
ク ⇒ ク グ ⇒ グ ケ ⇒ ケ ゲ ⇒ ゲ コ ⇒ コ ゴ ⇒ ゴ サ ⇒ サ ザ ⇒ ザ シ ⇒ シ ジ ⇒ ジ

全角片仮名:アイウエケ、パピュプョペェポォ
全角平仮名:あいうえお、半角片仮名アイウエオ、
濁点平仮名:がぎくげご、濁点半角片仮名ガギグゲゴ
半濁平仮名:ぱぴぷぺぼ、半濁半角片仮名パピプペポ
濁点重複:バ゙ビ゙
ヴィー、ヴィー
全角英数記号: 012,abc,ABC,#$%¥
半角英数記号: 012,abc,ABC,#$%\

20.全角カタカナを半角カナへの変換でalt_dic={u'パ':u'パ', u'プ':u'プ'}, del_list=[u'パ', u'プ']とすると
>>> zen_conv(test, mode='kata2han', alt_dic={u'パ':u'パ', u'プ':u'プ'}, del_list=[u'パ', u'プ'], debug=1)
ク ⇒ ク グ ⇒ グ ケ ⇒ ケ ゲ ⇒ ゲ コ ⇒ コ ゴ ⇒ ゴ サ ⇒ サ ザ ⇒ ザ シ ⇒ シ ジ ⇒ ジ

全角片仮名:アイウエケ、パピュプョペェポォ
全角平仮名:あいうえお、半角片仮名アイウエオ、
濁点平仮名:がぎくげご、濁点半角片仮名がギグゲゴ
半濁平仮名:ぱぴぷぺぼ、半濁半角片仮名パピプペポ
濁点重複:バ゙ビ゙
ヴィー、ヴィー
全角英数記号: 012,abc,ABC,#$%¥
半角英数記号: 012,abc,ABC,#$%\

[mire@localhost ~]$


 ソースコードは以下の通り。処理の基本は1文字ずつ辞書のキーに対する価に基づき置換して行く単純なもので、味噌は、濁点と半濁点の処理の為、unicode文字列を反転して末尾の文字から処理を進め濁点と半濁点に遭遇したら次の文字を見て単独の濁点と半濁点とするか濁点と半濁点付きの文字に置換するかを決めて行く様にする必要があることだ。その詳細は、記述が重複するのでコード内のコメントで確認頂きたい。
続きを読む
タグ:Unicode Python
posted by Mire at 03:03 | Comment(0) | TrackBack(0) | Pythonプログラミング | このブログの読者になる | 更新情報をチェックする

2012年01月08日

【数学】順列出力関数の作成(7)〜下桁の一括処理で高速化

 前稿では、全要素桁数の順列生成時のみの最適化で、大幅な高速化を実現した。今回は、それをさらに一歩進めて残り5桁でその後の全桁の追加をまとめて行なう様にして試た。結果として、メモリ限界の12要素12桁順列の出力でも36分程度で処理出来る様になり、ようやくこの関数も実用可能性が出て来た次第だ。
 発想は前稿のコードがketa==2の時の処理だったものを、さらにketa==5のときに、追加で後の4桁分の順列文字列の生成処理を一括で行なわせるだけではあるが、全順列生成で一番時間のかかる12全要素の桁数の順列で1時間を大きく切ることが出来たことで次稿以降で予定の実用化に向け大きく前進出来たと思っている。
 そんなソースコードは以下の通りだ。

続きを読む
posted by Mire at 19:57 | Comment(0) | TrackBack(0) | Pythonプログラミング | このブログの読者になる | 更新情報をチェックする

2012年01月07日

【数学】順列出力関数の作成(6)〜最終要素確定時処理で高速化

 前稿では、zlib.compress()による文字列圧縮を使うことで、そのままなら処理中に全メモリー空間を超過し (生成文字列12バイト×479001600+11桁迄の参照文字列11バイト×479001600の11,017,036,800バイトを超えるメモリーがreturn前に消費し)OUT OF MEMORY となることを回避したが、予告通りメモリー対策は一先ずこの程度で放置して本稿からは処理速度の改善をしていく。
 本稿での対策は極めてシンプルで限定的なものであるが前稿の12要素12桁順列生成に4時間も費やしていたものを100分程度で生成出来る様にした成果面はとても大きいと思う。実のところ、本稿の改善部分は早々と組み込んでいたのだが、メモリー対策の効果比較面で邪魔になったので、ここ迄省いたコードを示させて頂いた次第だ。
 発想は簡単で残り1桁の要素を埋める作業自体は、その一つ前にまとめて行なっても構わないだろうと言うもので、これにより、最後の479001600回分のループ処理を不要にしただけである。コードは以下の通りだが、同時にここ迄なるとコード自体がかなり混雑して来て本体部分が何処か判り辛くなって来たのでdebug用の画面出力とlogファイル出力を関数の引数次第でif文制御する様に記述し判り易くさせて頂いた。そのソースコードは以下の通りだ。
続きを読む
posted by Mire at 14:39 | Comment(0) | TrackBack(0) | Pythonプログラミング | このブログの読者になる | 更新情報をチェックする

2012年01月03日

【数学】順列出力関数の作成(5)〜固定長複数順列のZIP化でメモリー対策

 前稿では複数の順列をtab区切り文字列でまとめてメモリー上に置くことで11要素11桁の全順列を生成する様に出来た。しかし、12要素12桁では正味の順列文字列だけで5,748,019,200バイト(12バイト×12!)も必要な為、当方のPCの様に実メモリー2G、SWAP 4Gというメモリー空間ではまともなやり方では物理的に処理出来る筈もない。本稿では、それを可能にするコードを提示させて頂く。
 対策方法は首記の通り、等幅の順列を区切り文字なしで固定長文字列で扱う仕様にした上でZIP圧縮をかけメモリー上の記録量を削減させることにある。結果として個別の記録文字列の生成には多少時間がかかるが、メモリーへの書込み負荷が減る分早く処理出来るし、12要素12桁の順列処理迄ならメモリー不足も解消した。次回は高速化を課題として取り組む予定である。
続きを読む
posted by Mire at 23:04 | Comment(0) | TrackBack(0) | Pythonプログラミング | このブログの読者になる | 更新情報をチェックする

【数学】順列出力関数の作成(4)〜TAB区切り複数順列でメモリー対策

 全稿迄のコードでは、1つの順列を1つのオブジェクトとしてメモリー上に置く仕組みの為、単純にlistオブジェクト、tupleオブジェクト、文字列オブジェクトの生成インスタンスのメモリー上の大きさの差だけ改善しただけのことである。その結果として中でも効率の良い文字列オブジェクトにしたところで11要素11桁順列の総文字数439,084,800バイトの文字列すらpythonでは処理出来ないとすると、いくらユーザ思考にとって素直なオブジェクトデータ型のみで構成した仕様が原因とあっては寂しい限りである。
 オブジェクト型のインスタンスを保持する場合、オブジェクトの型と記憶場所をデータ本体以外に必要となるので、数が増えれば増える程メモリー効率は悪くなってしまう。PythonにC言語にある様なブリミディブな配列やポインタは存在しないのでそこは工夫が必要になる。そこで前稿迄でPythonの型の中では文字列型がもっともメモリ効率が良かったことは確認出来た訳なので、今回は文字列オブジェクト1つに複数の順列を記録する仕様に変更して試た。
 尚、今回は判り易さを優先し複数の順列をtab文字でjoin()し記録、tab文字でsplit()し復元利用する仕様とした。そのコードと実行結果は以下の通りだが、これだけでは11要素11桁順列迄が限界だった。次稿ではそれをさらに改善する予定である。
続きを読む
posted by Mire at 19:53 | Comment(0) | TrackBack(0) | Pythonプログラミング | このブログの読者になる | 更新情報をチェックする
月額見放題1,000円開始キャンペーンバナー(画像ありver)
紺碧の艦隊 ルパン三世 GREAT CHASE クリックプロモーション
<< 2012年01月 >>
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        
カテゴリ
タグクラウド
ファン
利用中のオープンソース
最近のコメント
最近の記事
過去ログ
QRコード
レガシーなアプリはいかが?
Dell 法人のお客様ページ
  • 【法人様向け】デル、お得なキャンペーン情報
  • 法人のお客様向け ストレージソリューション
  • 法人のお客様向け ネットワークソリューション
  • 【SOHO法人様向け】デル・オンライン広告限定ページ
  • デル-個人のお客様ページ
  • 【個人のお客様向け】デル・オンライン広告限定ページ
  • オンライン広告限定キャンペーンページ
  • ソフトウェア&周辺機器 パソコン工房
    ツートップインターネットショップ(twotop.co.jp) マウスコンピューター/G-Tune
  • ×

    この広告は1年以上新しい記事の投稿がないブログに表示されております。