【问题标题】:How to compare two strings with different unicode?如何比较具有不同 unicode 的两个字符串?
【发布时间】:2019-07-26 12:16:11
【问题描述】:

当我进行字符串比较时,我得到两个字符串不相等,即使它们相等。

我正在从 2 个 PDF 中提取文本。提取的文本是相同的。但我可以看到其中一个字体发生了一些变化。我不明白为什么?

str1 = '确认'

str2 = '确认'

str1 == str2

错误

【问题讨论】:

    标签: python-3.x ligature


    【解决方案1】:

    问题是第一种情况下字符串中的“fi”是一个连字(https://en.wikipedia.org/wiki/Typographic_ligature),而第二种情况是“f”和“i”之和。

    您可以使用一个函数来检查连字是否存在并将其替换为纯文本

    def ligature(string):
        if 'fi' in string:
            string.replace('fi', 'fi')
        return string
    

    如果您在文本中找到更多内容,还可以为其他连字添加其他 if 语句。

    【讨论】:

    • 嗨@bh7781 如果这个或任何答案已经解决了您的问题,请考虑通过单击复选标记接受它。这向更广泛的社区表明您已经找到了解决方案,并为回答者和您自己提供了一些声誉。没有义务这样做。
    【解决方案2】:

    使用 difflib 库,您可以看到要比较的字符串之间存在明显的差异。要自己检查,您可以尝试如下说明:

    >>> import difflib
    >>> str2 = 'Confirmations'
    >>> str1 = 'Confirmations'
    >>> print('\n'.join(difflib.ndiff([str1], [str2])))
    
    

    产生于

    - Confirmations
    ?    ^
    
    + Confirmations
    ?    ^^
    
    >>>
    

    【讨论】:

      【解决方案3】:

      您需要比较字符串的规范化形式以忽略不相关的印刷差异。

      例如:

      In [59]: import unicodedata
      
      In [60]: str1 = 'Confirmations'
      
      In [61]: str2 = 'Confirmations'
      
      In [62]: str1 == str2
      Out[62]: False
      
      In [63]: unicodedata.normalize('NFKD', str1) == unicodedata.normalize('NFKD', str2)
      Out[63]: True
      

      【讨论】:

        猜你喜欢
        • 2013-03-30
        • 2020-01-30
        • 1970-01-01
        • 2012-03-23
        • 2011-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多