文字列の正規化

タグクラウドなんか作る時に必要になったので以下を作成&テスト。メソッド regtest() に request が渡されてるのは Django でやってるから。

import unicodedata

def regtest(request):
    data = [
        u'あいうえおがぎぐげご',
        u'アイウエオガギグゲゴ',
        u'アイウエオガギグゲゴ',
        u'牛乳石鹸良石鹸',
        u'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
        u'abcdefghijklmnopqrstuvwxyz',
        u'0123456789',
        u'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
        u'abcdefghijklmnopqrstuvwxyz',
        u'0123456789',
        u'!"#$%&()*+,-./:;',
        u'<=>?@[\]^_`{|}~ ',
        u'!”#$%&()*+,−./:;',
        u'<=>?@[¥]^_‘{|}〜 ',
        u"'",
        u"’",
        u'、。,.・',
        u'゛゜´`¨^',
        u' ̄_ヽヾゝゞ〃仝々〆〇',
        u'ー―‐/\〜‖|…‥',
        u'‘’“”()〔〕[]{}〈〉《》「」『』【】',
        u'+−±×÷=≠<>≦≧∞∴',
        u'♂♀°′″℃¢£§☆★○●◎◇◆□■△▲▽▼※〒',
        u'→←↑↓〓∈∋⊆⊇⊂⊃∪∩∧∨¬⇒⇔',
        u'∀∃∠⊥⌒∂∇≡≒≪≫√∽∝∵∫∬ʼn♯♭♪†‡¶◯',
        u'ゎゐゑヮヰヱヴヵヶ',
        u'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ',
        u'αβγδεζηθικλμνξοπρστυφχψω',
        u'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ',
        u'абвгдеёжзийклмнопрстуфхцчшщъыьэюя',
        u'─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂',
        u'①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳',
        u'ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ',
        u'㌘㌔㌧',
        u'㍉㌢㍍',
        u'㌃㌶',
        u'㍑㍗㌍',
        u'㌦㌣㌫',
        u'㍊㌻',
        u'㎜㎝㎞',
        u'㎎㎏',
        u'㏄㎡',
        u'㍻㍾㍽㍼',
        u'〝〟∮∟⊿',
        u'№㏍℡',
        u'㊤㊥㊦㊧㊨',
        u'㈱㈲㈹',
    ]

    for val in data :
        # 元の文字列表示
        print val.encode('utf-8')

        val = val.lower()
        reg_tag = unicodedata.normalize('NFKC', val)

        # 正規化後の文字列表示
        print reg_tag.encode('utf-8')

    return None

出力結果。1行目が元の文字列。2行目が正規化後の文字列。

あいうえおがぎぐげご
あいうえおがぎぐげご

アイウエオガギグゲゴ
アイウエオガギグゲゴ

アイウエオガギグゲゴ
アイウエオガギグゲゴ

牛乳石鹸良石鹸
牛乳石鹸良石鹸

ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz

abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz

0123456789
0123456789

ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz

abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz

0123456789
0123456789

!"#$%&()*+,-./:;
!"#$%&()*+,-./:;

<=>?@[\]^_`{|}~ 
<=>?@[\]^_`{|}~ 

!”#$%&()*+,−./:;
!”#$%&()*+,-./:;

<=>?@[¥]^_‘{|}〜 
<=>?@[¥]^_‘{|}~ 

'
'

’
’

、。,.・
、。,.・

゛゜´`¨^
 &#12441; &#12442; &#769;` &#776;^

 ̄_ヽヾゝゞ〃仝々〆〇
 &#772;_ヽヾゝゞ〃仝々〆〇

ー―‐/\〜‖|…‥
ー―‐/\~‖|.....

‘’“”()〔〕[]{}〈〉《》「」『』【】
‘’“”()〔〕[]{}〈〉《》「」『』【】

+−±×÷=≠<>≦≧∞∴
+-±×÷=≠<>≦≧∞∴

♂♀°′″℃¢£§☆★○●◎◇◆□■△▲▽▼※〒
♂♀°′′′°C&#162;&#163;§☆★○●◎◇◆□■△▲▽▼※〒

→←↑↓〓∈∋⊆⊇⊂⊃∪∩∧∨¬⇒⇔
→←↑↓〓∈∋⊆⊇⊂⊃∪∩∧∨&#172;⇒⇔

∀∃∠⊥⌒∂∇≡≒≪≫√∽∝∵∫∬ʼn♯♭♪†‡¶◯
∀∃∠⊥⌒∂∇≡≒≪≫√∽∝∵∫∫∫å‰♯♭♪†‡¶◯

ゎゐゑヮヰヱヴヵヶ
ゎゐゑヮヰヱヴヵヶ

ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ
αβγδεζηθικλμνξοπρστυφχψω

αβγδεζηθικλμνξοπρστυφχψω
αβγδεζηθικλμνξοπρστυφχψω

АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ
абвгдеёжзийклмнопрстуфхцчшщъыьэюя

абвгдеёжзийклмнопрстуфхцчшщъыьэюя
абвгдеёжзийклмнопрстуфхцчшщъыьэюя

─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂
─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂

①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳
1234567891011121314151617181920

ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ
iiiiiiivvviviiviiiixx

㌘㌔㌧
グラムキロトン

㍉㌢㍍
ミリセンチメートル

㌃㌶
アールヘクタール

㍑㍗㌍
リットルワットカロリー

㌦㌣㌫
ドルセントパーセント

㍊㌻
ミリバールページ

㎜㎝㎞
mmcmkm

㎎㎏
mgkg

㏄㎡
ccm2

㍻㍾㍽㍼
平成明治大正昭和

〝〟∮∟⊿
〝〟∮∟⊿

№㏍℡
NoKKTEL

㊤㊥㊦㊧㊨
上中下左右

㈱㈲㈹
(株)(有)(代)

ミリとか(株)とか分解してくれるんだなあ。