【问题标题】:Replace accented character with html entity用 html 实体替换重音字符
【发布时间】:2018-10-21 03:05:28
【问题描述】:

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

例子:

vèlit 
[needs to become] 
vèlit

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

这个:

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

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

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

什么都不做。

【问题讨论】:

  • 字符串不能被修改。 replace 使用替换的文本创建一个新字符串并返回它。 word = word.replace('è','è') 可能就是你所追求的。
  • 顺便说一句,python 3 中不需要 u 字符串限定符 - 字符串已经是 unicode。
  • 谢谢!只使用 Python 几个月,所以有些事情仍然让我无法理解。谢谢! :D

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


【解决方案1】:

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

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

查看str.replace()

【讨论】:

    【解决方案2】:

    您可以使用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 - 或两个代码点 - 拉丁小写字母 E 后跟 组合重音。在后一种情况下(称为 decomposed 形式),翻译将无法按预期工作。

    要解决这个问题,您可以使用 unicodedata 模块中的 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'
    

    【讨论】:

    • 对于这个常见问题,这是迄今为止更好、更通用的解决方案,因为通常当文本中有一个重音字符时,还有其他一些你不会立即想到的常见字符。如果要翻译的字符串已经包含html代码,添加条件排除等:for k, v in html.entities.codepoint2name.items() if k > 0xa0
    【解决方案3】:

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

    对我来说,我需要那本字典,因为 codepoint2name 不包括 ł

    所以,创建翻译表的代码稍微改成这样:

    table = {get_wide_ordinal(v): '&{}'.format(k) for k, v in html.entities.html5.items()}

    get_wide_ordinal 我从https://stackoverflow.com/a/7291240/1233830 那里得到的:

    def get_wide_ordinal(char):
        if len(char) != 2:
            return ord(char)
        return 0x10000 + (ord(char[0]) - 0xD800) * 0x400 + (ord(char[1]) - 0xDC00)
    

    因为html5 查找中的某些字符是两个字节宽。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-20
      • 2012-06-14
      • 2023-03-11
      • 2015-02-25
      • 2012-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多