プログラム問答

Python 文字列クリーンアップ + 操作 (アクセント記号付き文字)

 

私はフルのような名前のデータベースがある:

John Smith  
Scott J. Holmes  
Dr. Kaplan  
Ray's Dog  
Levi's  
Adrian O'Brien  
Perry Sean Smyre  
Carie Burchfield-Thompson  
Björn Árnason

非アクセント文字を文字列に変換する必要があるそれらのアクセントを持ついくつかの外国人の名前です。

完全名を変換したいのですが (のような文字を除去した後"'"、"-") をユーザーのログインのような。

john.smith  
scott.j.holmes  
dr.kaplan  
rays.dog  
levis
adrian.obrien  
perry.sean.smyre
carie.burchfieldthompson  
bjorn.arnason

これまでのところ私がある:

Fullname.strip()  # get rid of leading/trailing white space
Fullname.lower() # make everything lower case


... # after bad chars converted/removed
Fullname.replace(' ', '.') # replace spaces with periods
#1

[編集済み] このリンクを見てください。

ここではページからのコード

def latin1_to_ascii (unicrap):
    """This replaces UNICODE Latin-1 characters with
    something equivalent in 7-bit ASCII. All characters in the standard
    7-bit ASCII range are preserved. In the 8th bit range all the Latin-1
    accented letters are stripped of their accents. Most symbol characters
    are converted to something meaningful. Anything not converted is deleted.
    """
    xlate = {
        0xc0:'A', 0xc1:'A', 0xc2:'A', 0xc3:'A', 0xc4:'A', 0xc5:'A',
        0xc6:'Ae', 0xc7:'C',
        0xc8:'E', 0xc9:'E', 0xca:'E', 0xcb:'E',
        0xcc:'I', 0xcd:'I', 0xce:'I', 0xcf:'I',
        0xd0:'Th', 0xd1:'N',
        0xd2:'O', 0xd3:'O', 0xd4:'O', 0xd5:'O', 0xd6:'O', 0xd8:'O',
        0xd9:'U', 0xda:'U', 0xdb:'U', 0xdc:'U',
        0xdd:'Y', 0xde:'th', 0xdf:'ss',
        0xe0:'a', 0xe1:'a', 0xe2:'a', 0xe3:'a', 0xe4:'a', 0xe5:'a',
        0xe6:'ae', 0xe7:'c',
        0xe8:'e', 0xe9:'e', 0xea:'e', 0xeb:'e',
        0xec:'i', 0xed:'i', 0xee:'i', 0xef:'i',
        0xf0:'th', 0xf1:'n',
        0xf2:'o', 0xf3:'o', 0xf4:'o', 0xf5:'o', 0xf6:'o', 0xf8:'o',
        0xf9:'u', 0xfa:'u', 0xfb:'u', 0xfc:'u',
        0xfd:'y', 0xfe:'th', 0xff:'y',
        0xa1:'!', 0xa2:'{cent}', 0xa3:'{pound}', 0xa4:'{currency}',
        0xa5:'{yen}', 0xa6:'|', 0xa7:'{section}', 0xa8:'{umlaut}',
        0xa9:'{C}', 0xaa:'{^a}', 0xab:'<<', 0xac:'{not}',
        0xad:'-', 0xae:'{R}', 0xaf:'_', 0xb0:'{degrees}',
        0xb1:'{+/-}', 0xb2:'{^2}', 0xb3:'{^3}', 0xb4:"'",
        0xb5:'{micro}', 0xb6:'{paragraph}', 0xb7:'*', 0xb8:'{cedilla}',
        0xb9:'{^1}', 0xba:'{^o}', 0xbb:'>>',
        0xbc:'{1/4}', 0xbd:'{1/2}', 0xbe:'{3/4}', 0xbf:'?',
        0xd7:'*', 0xf7:'/'
    }

    r = ''
    for i in unicrap:
        if xlate.has_key(ord(i)):
            r += xlate[ord(i)]
        elif ord(i) >= 0x80:
            pass
        else:
            r += i
    return r

# This gives an example of how to use latin1_to_ascii().
# This creates a string will all the characters in the latin-1 character set
# then it converts the string to plain 7-bit ASCII.
if __name__ == '__main__':
s = unicode('','latin-1')
for c in range(32,256):
    if c != 0x7f:
        s = s + unicode(chr(c),'latin-1')
print 'INPUT:'
print s.encode('latin-1')
print
print 'OUTPUT:'
print latin1_to_ascii(s)
#2

サード パーティー製のモジュールをインストールするには恐れていない場合は、ぜひがある、 Perl モジュールの python ポートText::Unidecode(またですpypi に).

モジュールがルックアップ テーブルを使用して文字を翻字するよりは何もしません。コードに目をやった、それは非常に単純に見えます。私はそれはかなり任意の OS 上と任意の Python のバージョン (crossingfingers) に取り組んでいると仮定します。また、アプリケーションにバンドルするは簡単です。

このモジュールを参照のテーブルを手動で作成する必要はありません (リスクの軽減は完全であること =)。

このモジュールの unicode 正規化手法に比較しての利点はこれです: ユニコード正規化のすべての文字を交換しないこと。良い例は、文字「æ」のようなものです。Unicode 正規化「手紙として、小文字」(Ll) が表示されます。これを使用する意味は normalize 方法あなたを与えるも、置換文字も役に立つヒント。残念ながら、その文字は ASCII で表現可能です。だからあなたのエラーを取得します。

前述のモジュール良い仕事でこれを行います。これは、"ae"と「æ」を実際に置き換えられます。実際には便利ですし、理にかなって。

私が見た最も印象的なものは、それがさらにいるということです。それも日本語の仮名文字ほとんど正しく置き換えられます。たとえばは「↓」「ha と」置き換えます。Wich は、完全に罰金です。が現在のバージョンとしてフールプルーフではない「ち」は、「チー」の代わりに"ti"を置き換えます。それを気に多くのエキゾチックな文字を処理する必要があります

モジュールの使用法は簡単:。

from unidecode import unidecode
var_utf8  = "æは".decode("utf8")
unidecode( var_utf8 ).encode("ascii")
>>> "aeha"

このモジュールと直接やる事があることに注意してください。それはちょうど私はそれを非常に有用見つけることを起こる。

編集:私が提出したパッチは日本語の仮名に関するバグを修正しました。私はのみ、1 つのすぐに見付けてでしたを修正しました。私はいくつか見逃している可能性があります。

#3

次の関数がジェネリックです。

import unicodedata

def not_combining(char):
        return unicodedata.category(char) != 'Mn'

def strip_accents(text, encoding):
        unicode_text= unicodedata.normalize('NFD', text.decode(encoding))
        return filter(not_combining, unicode_text).encode(encoding)

# in a cp1252 environment
>>> print strip_accents("déjà", "cp1252")
deja
# in a cp1253 environment
>>> print strip_accents("καλημέρα", "cp1253")
καλημερα

明らかに、あなたの文字列のエンコード知っている必要があります。

#4

このような何か

# coding=utf-8

def alnum_dot(name, replace={}):
    import re

    for k, v in replace.items():
    	name = name.replace(k, v)

    return re.sub("[^a-z.]", "", name.strip().lower())

print alnum_dot(u"Frédrik Holmström", {
    u"ö":"o",
    " ":"."
})

2 番目の引数は、dict 置き換え、すべての非 a ~ z の文字のと。置き換えられる文字を剥奪します。

#5

Translate メソッドの文字を削除できます。任意の文字を削除できます。

Fullname.translate(None,"'-\"")

文字の全体のクラスを削除する場合は、再使用したいと思うかもしれないモジュール。

re.sub('[^a-z0-9 ]', '', Fullname.strip().lower(),)