如何在Python中搜索和替换utf-8特殊字符?

Fra*_*ank 5 python string replace utf-8

我是Python初学者,我有一个utf-8问题.

我有一个utf-8字符串,我想用ASCII替换替换所有德语变音符号(在德语中,u-umlaut'ü'可能被重写为'ue').

u-umlaut有unicode代码点252,所以我试过这个:

>>> str = unichr(252) + 'ber'
>>> print repr(str)
u'\xfcber'
>>> print repr(str).replace(unichr(252), 'ue')
u'\xfcber'
Run Code Online (Sandbox Code Playgroud)

我期待最后一个字符串u'ueber'.

我最终想做的是用'ue'替换文件中的所有u-umlaut:

import sys
import codecs      
f = codecs.open(sys.argv[1],encoding='utf-8')
for line in f: 
    print repr(line).replace(unichr(252), 'ue')
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助!(我使用的是Python 2.3.)

Bri*_*ell 9

repr(str)返回一个引用的版本str,当打印出来时,你可以用Python键入它来获取字符串.所以,它是一个字面上包含\xfcber的字符串,而不是包含的字符串über.

你可以只用str.replace(unichr(252), 'ue')更换üue.

如果你需要获得结果的引用版本,虽然我不相信你应该需要它,你可以将整个表达式包装在repr:

repr(str.replace(unichr(252), 'ue'))
Run Code Online (Sandbox Code Playgroud)


Khe*_*ben 8

我认为以更简单的方式进行操作是最容易和更清楚的,直接使用unicode表示os'ü'比unichr(252)更好.

>>> s = u'über'
>>> s.replace(u'ü', 'ue')
u'ueber'
Run Code Online (Sandbox Code Playgroud)

没有必要使用repr,因为这将打印字符串的'Python表示',您只需要呈现可读字符串.

你还需要在.py文件的开头包含以下行,以防它不存在,以告诉文件的编码

#-*- coding: UTF-8 -*-
Run Code Online (Sandbox Code Playgroud)

补充:当然,声明的编码必须与文件的编码相同.请检查一下可能是一些问题(例如,我在Windows上遇到Eclipse问题,因为它默认将文件写为cp1252.它也应该是系统的相同编码,可以是utf-8,或拉丁语-1或其他人.


另外,不要将其str用作变量的定义,因为它是Python库的一部分.你以后可能会遇到问题.

(我在尝试Python 2.6,我认为在Python 2.3中结果是一样的)


Joh*_*hin 6

您可以避免所有源文件编码内容及其问题.使用Unicode名称,然后它非常明显地在做什么,并且可以在任何地方读取和修改代码.

我不知道任何语言,唯一的重音拉丁字母是小写u-with-umlaut-aka-diaeresis,所以我添加了代码来循环翻译表,假设你需要它.

# coding: ascii

translations = (
    (u'\N{LATIN SMALL LETTER U WITH DIAERESIS}', u'ue'),
    (u'\N{LATIN SMALL LETTER O WITH DIAERESIS}', u'oe'),
    # et cetera
    )

test = u'M\N{LATIN SMALL LETTER O WITH DIAERESIS}ller von M\N{LATIN SMALL LETTER U WITH DIAERESIS}nchen'

out = test
for from_str, to_str in translations:
    out = out.replace(from_str, to_str)
print out
Run Code Online (Sandbox Code Playgroud)

输出:

Moeller von Muenchen
Run Code Online (Sandbox Code Playgroud)


Ami*_*any 5

我会定义一个特殊字符字典(我想映射)然后我使用translate方法。

line = 'Ich möchte die Qualität des Produkts überprüfen, bevor ich es kaufe.'

spcial_char_map = {ord('ä'):'ae', ord('ü'):'ue', ord('ö'):'oe', ord('ß'):'ss'}
print(line.translate(spcial_char_map))
Run Code Online (Sandbox Code Playgroud)

你会得到以下结果:

Ich moechte die Qualitaet des Produkts ueberpruefen, bevor ich es kaufe.
Run Code Online (Sandbox Code Playgroud)

  • @Pontis没有人使用“sz”而不是“ß”,人们只使用“ss”。 (2认同)