Python字符串清理+操作(重音字符)

Gee*_*ock 5 python regex string unicode

我有一个充满名字的数据库,如:

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

有一些带有重音符号的外来名称需要转换为带有非重音字符的字符串.

我想将全名(在删除"'"," - "等字符后)转换为用户登录,例如:

john.smith  
scott.j.holmes  
dr.kaplan  
rays.dog  
levis
adrian.obrien  
perry.sean.smyre
carie.burchfieldthompson  
bjorn.arnason
Run Code Online (Sandbox Code Playgroud)

到目前为止,我有:

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
Run Code Online (Sandbox Code Playgroud)

sol*_*oth 12

看一下这个链接[编辑]

这是页面中的代码

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)
Run Code Online (Sandbox Code Playgroud)

  • @Mark - 哈,对于网络链接的永久性,万岁! (2认同)

exh*_*uma 5

如果你不害怕安装第三方模块,那么看一下Perl模块Text::Unidecodepython端口(它也在pypi上).

该模块只是使用查找表来音译字符.我浏览了代码,看起来非常简单.所以我认为它几乎适用于任何操作系统和任何Python版本(交叉手).它也很容易捆绑您的应用程序.

使用此模块,您不必手动创建查找表(=降低风险,因为它不完整).

与unicode规范化技术相比,此模块的优点是:Unicode规范化不会替换所有字符.一个很好的例子是像"æ"这样的角色.Unicode规范化将其视为"Letter,lowercase"(Ll).这意味着使用该normalize方法既不会提供替换字符,也不会提供有用的提示.不幸的是,该字符在ASCII中无法表示.所以你会得到错误.

上面提到的模块在这方面做得更好.这实际上将"æ"替换为"ae".这实际上是有用的,也是有道理的.

我见过的最令人印象深刻的事情是,它走得更远.它甚至取代了日本的假名字符大多正常.例如,它将"は"替换为"ha".这很好.虽然目前的版本用"ti"代替"chi"代替"ち",但这并非万无一失.因此,你必须小心处理它,以寻找更具异国情调的角色.

该模块的用法很简单::

from unidecode import unidecode
var_utf8  = "æ?".decode("utf8")
unidecode( var_utf8 ).encode("ascii")
>>> "aeha"
Run Code Online (Sandbox Code Playgroud)

请注意,我直接与此模块无关.我发现它非常有用.

编辑:我提交的补丁修复了有关日本假名的错误.我只修复了我能立刻发现的那个.我可能错过了一些.