Python 3.5用html实体替换重音字符

时间:2018-05-10 18:56:28

标签: python python-3.x replace python-unicode iso-8859-15

我正在尝试自动化一系列查询但是,要做到这一点,我需要用相应的html实体替换带有重音的字符。 出于原因,它需要在Python3中

示例:

vèlit 
[needs to become] 
vèlit

问题是,每当我尝试做一个word.replace时,它都找不到它。

此:

if u'è' in sentence:
    print(u'Found è')

工作并找到“è”,但正在做:

word.replace('è','è')

什么都不做。

3 个答案:

答案 0 :(得分:2)

word.replace('è','è')替换为word = word.replace('è','è')并打印结果以进行检查。

word.replace('è','è')确实有效,但它实际上并未对word内容本身进行任何更改。

检查str.replace()

答案 1 :(得分:0)

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

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

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

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

>>> import html.entities
>>> s = 'vèlit'

>>> # Create the translation table
>>> table = {k: '&{};'.format(v) for k, v in html.entities.codepoint2name.items()}

>>> s.translate(table)
'vèlit'

>>> 'Voilà'.translate(table)
'Voilà'

请注意,重音拉丁字符可以由unicode代码点组合表示:'è'可以用单个代码点表示 - LATIN SMALL LETTER E WITH GRAVE - 或两个代码点 - LATIN SMALL LETTER E 后跟 COMBINING GRAVE ACCENT 。在后一种情况下(称为分解的形式),翻译将无法按预期工作。

要解决此问题,您可以使用{{3}中的normalize函数将双码点分解表单转换为单个代码点撰写表单Python标准库中的模块。

>>> decomposed
'vèlit'
>>> decomposed == s
False
>>> len(decomposed)    # decomposed is longer than composed
6
>>> decomposed.translate(table)
'vèlit'
>>> composed = unicodedata.normalize('NFC', decomposed)
>>> composed == s
True
>>> composed.translate(table)
'vèlit'

答案 2 :(得分:0)

作为对 snakecharmerb 提供的答案的更新,知道 Python 3.3 引入了 html.entities.html5 将更多字符映射到等效的 Unicode 字符可能会有所帮助。

对我来说,我需要那本字典,因为 sidebar <- dashboardSidebar( width=280, sidebarMenu(id = "sidebarmenu", menuItem(...), menuItem(..., menuSubItem(...), menuSubItem(...) ) ), sidebarMenu(id = "conditional_sidebarmenu", conditionalPanel(condition = "output.x === 1", menuItem("title", tabName="tabname") ) ) 不包括 codepoint2name

因此,创建翻译表的代码稍微更改为:

ł

我从https://stackoverflow.com/a/7291240/1233830得到的table = {get_wide_ordinal(v): '&{}'.format(k) for k, v in html.entities.html5.items()}

get_wide_ordinal

因为 def get_wide_ordinal(char): if len(char) != 2: return ord(char) return 0x10000 + (ord(char[0]) - 0xD800) * 0x400 + (ord(char[1]) - 0xDC00) 查找中的某些字符是两个字节宽。

请注意,此表中的 HTML5 实体dohtml5 结尾,这就是将其从格式字符串中删除的原因。