用 html 实体替换重音字符

Jor*_*rdi 4 python replace python-3.x python-unicode iso-8859-15

我正在尝试自动执行一系列查询,但是,我需要将带有重音符号的字符替换为相应的 html 实体。\n它需要在 Python3 中

\n

例子:

\n
v\xc3\xa8lit \n[needs to become] \nvèlit\n
Run Code Online (Sandbox Code Playgroud)\n

问题是,每当我尝试执行 a 时word.replace,它都找不到。

\n

这:

\n
if u'\xc3\xa8' in sentence:\n    print(u'Found \xc3\xa8')\n
Run Code Online (Sandbox Code Playgroud)\n

工作并找到“\xc3\xa8”,但执行以下操作:

\n
word.replace('\xc3\xa8','è')\n
Run Code Online (Sandbox Code Playgroud)\n

什么都不做。

\n

sna*_*erb 7

您可以使用str.translate方法和 python 的html包中的数据将字符转换为等效的 html 实体。

\n\n

为此,str.translate需要一个将字符(技术上是字符的整数表示形式或序数)映射到 html 实体的字典。

\n\n

html.entities.codepoint2name包含所需数据,但实体名称不受\'&\' 和\';\' 限制。您可以使用字典理解来创建包含所需值的表。

\n\n

创建表格后,以表格作为参数调用字符串的翻译方法,结果将是一个新字符串,其中任何具有 html 实体等效项的字符都将被转换。

\n\n
>>> import html.entities\n>>> s = \'v\xc3\xa8lit\'\n\n>>> # Create the translation table\n>>> table = {k: \'&{};\'.format(v) for k, v in html.entities.codepoint2name.items()}\n\n>>> s.translate(table)\n\'vèlit\'\n\n>>> \'Voil\xc3\xa0\'.translate(table)\n\'Voilà\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,带重音的拉丁字符可以由 unicode 代码点的组合表示:\'\xc3\xa8\' 可以由单个代码点 -带 GRAVE 的拉丁文小写字母 E - 或两个代码点 -后跟拉丁文小写字母 E表示通过结合庄重的口音。在后一种情况(称为分解形式)中,翻译将无法按预期进行。

\n\n

为了解决这个问题,您可以使用Python 标准库中unicodedata模块的标准化函数将两个代码点分解形式转换为单个代码点组合形式。

\n\n
>>> decomposed\n\'ve\xcc\x80lit\'\n>>> decomposed == s\nFalse\n>>> len(decomposed)    # decomposed is longer than composed\n6\n>>> decomposed.translate(table)\n\'ve\xcc\x80lit\'\n>>> composed = unicodedata.normalize(\'NFC\', decomposed)\n>>> composed == s\nTrue\n>>> composed.translate(table)\n\'vèlit\'\n
Run Code Online (Sandbox Code Playgroud)\n