【问题标题】:Unicode string comparison in python 2.7, how to normalise html elements like £ != \xa3python 2.7中的Unicode字符串比较,如何规范像£!= \xa3这样的html元素
【发布时间】:2018-03-10 19:14:30
【问题描述】:

我有一个数据库和一个新的 unicode 输入。

if new_field != old_field:
    update_db(new_field)

在 PyCharm 中两者看起来相同,即使当我将鼠标悬停并展开“视图”框时,我也会将它们复制粘贴到记事本中并且它们是相同的,例如:

u"<li>Laundromatic doofer drier £200 on collection</li>"
u"<li>Laundromatic doofer drier £200 on collection</li>"

造成错误的原因是井号的底层编码(为什么它不能有一个 pythonic 的单一方式?)。它们都是 unicode; type(new_field) is unicode.

我对此感到非常沮丧,以至于我将每个字段(大量销售宣传)分解为:

>set(old_field.split()) ^ set(new_field.split())

u'£200'  # from new_field
u'&#163;200'  # from old_field

有没有更好的方法来比较 python 中的 unicode(我使用的是 2.7)?即比

更普遍的东西
if new_field != old_field.replace(u"&#163;", u"\xa3")

新字段来自网络,然后被传递给bleach.clean,我不得不将它传递给.encode("utf-8"),因为它显然会产生(sqlite3)非法字符来表示nbsp。旧字段在通过 bleach.clean 之前已从 sqlite 获取(作为事后的想法),它不需要 .encode("utf-8"),因为 sqlite 只存储 unicode。

【问题讨论】:

    标签: python-2.7


    【解决方案1】:
    from HTMLParser import HTMLParser
    new_field = u'\xa3200'
    old_field = u'&#163;200'
    h = HTMLParser()
    equiv = h.unescape(old_field) == h.unescape(new_field)
    equiv2 = h.unescape(old_field) == new_field  # To be clear only ampersand hash strings get replaced.
    print(u"   {} == {} ? {} and {}".format(new_field, old_field, equiv, equiv2))
    
    
       £200 == &#163;200 ? True and True
    

    我就是这样做的,感谢 Fabich,https://stackoverflow.com/a/38481378/866333

    一个不能有太多“解码与号哈希字符串”类型的问题;谷歌只是给我回了英镑符号!

    【讨论】:

      猜你喜欢
      • 2016-08-29
      • 1970-01-01
      • 2020-05-29
      • 2018-04-16
      • 1970-01-01
      • 2011-04-07
      • 1970-01-01
      • 2022-07-22
      • 1970-01-01
      相关资源
      最近更新 更多