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

2024-06-09 18:32:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我是一个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'

我希望最后一个字符串是u'ueber'

我最终想做的是用“ue”替换文件中的所有u-umlauts:

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

谢谢你的帮助!(我使用的是Python2.3。)


Tags: 字符串importsyslinereplaceutfprintcodecs
3条回答

我认为用一种更直接的方式来实现它是最简单和清晰的,直接使用unicode表示比unichr(252)更好。

>>> s = u'über'
>>> s.replace(u'ü', 'ue')
u'ueber'

不需要使用repr,因为这将打印字符串的“Python表示”,您只需要显示可读的字符串。

如果.py文件还不存在,您还需要在其开头包含以下行,以告知文件的编码

#-*- coding: UTF-8 -*-

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


另外,不要使用str作为变量的定义,因为它是Python库的一部分。你以后可能会有问题。

(我正在尝试Python2.6,我认为在Python2.3中结果是相同的)

^{}返回一个带引号的str版本,打印出来后,您可以作为Python重新输入,以获取字符串。所以,它是一个字面上包含\xfcber的字符串,而不是包含über的字符串。

您可以使用str.replace(unichr(252), 'ue')ü替换为ue

如果您需要获得该结果的引用版本,尽管我不认为您需要它,但您可以将整个表达式包装为repr

repr(str.replace(unichr(252), 'ue'))

你可以避免所有源文件编码的东西和它的问题。使用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

输出:

Moeller von Muenchen

相关问题 更多 >