两个字符串比较的问题 Python - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
vegetableChick
V2EX    Python

两个字符串比较的问题 Python

  •  
  •   vegetableChick 2021 年 5 月 6 日 3525 次点击
    这是一个创建于 1764 天前的主题,其中的信息可能已经有所发展或是发生改变。

    xdm,遇到一个问题。

    背景:

    需要比较两个字符串是否相等, 无视中英文标点符号

    问题:

    通过replace等格式转换之后, 比较两个字符串

    d = "进出口中心" s = "进出口中心" print(d == s) 

    但是两个看起来一样的字符串不相等, 第一个中间出现了特殊字符

    如何把这种特殊符号处理掉,然后按相同去判断?

    13 条回复    2021-05-07 12:55:46 +08:00
    Te11UA
        1
    Te11UA  
       2021 年 5 月 6 日
    ```
    import re


    def filter_str(desstr, restr=''):
    # 过滤除中英文及数字以外的其他字符
    res = re.compile("[^\\u4e00-\\u9fa5^a-z^A-Z^0-9]")
    return res.sub(restr, desstr)

    print(filter_str(d) == s)
    ```
    vegetableChick
        2
    vegetableChick  
    OP
       2021 年 5 月 6 日
    @Te11UA `- ) ( , .`会有这些符号
    Te11UA
        3
    Te11UA  
       2021 年 5 月 6 日
    @vegetableChick #2 自己加正则不就行了
    no1xsyzy
        4
    no1xsyzy  
       2021 年 5 月 6 日
    通常来说是根据可打印与否来分析 ''.join(c for c in d if c.isprintable())
    但如果空格也不需要的话,对每个字符 strip 也可 ''.join(c.strip() for c in d)
    具体情况,具体分析

    @Te11UA 一个 [] 里面只需要一个 ^ 就行。你现在这个代码 filter_str("^") == "^",与注释不符
    bytesfold
        5
    bytesfold  
       2021 年 5 月 6 日
    Python Cookbook 第二章第九节
    mekingname
        6
    mekingname  
       2021 年 5 月 6 日
    @bytesfold normalize 并不能移除`\u2029`这个零宽字符。
    NoAnyLove
        7
    NoAnyLove  
       2021 年 5 月 6 日
    ^ 2.12
    Ug24m31
        8
    Ug24m31  
       2021 年 5 月 6 日
    某些部首的问题,github 上有康熙部首替换字典
    vegetableChick
        10
    vegetableChick  
    OP
       2021 年 5 月 6 日
    @NoAnyLove @Te11UA @Ug24m31 @bytesfold @delectate @mekingname @no1xsyzy 感谢大家 暂时使用 @no1xsyzy 这种方法 `''.join(c for c in d if c.isprintable())` 顺便问一下 这种问题一般是什么原因导致的?
    luckyc
        11
    luckyc  
       2021 年 5 月 6 日
    长得一样, Unicode 不一样.
    no1xsyzy
        12
    no1xsyzy  
       2021 年 5 月 7 日
    print(f"{d=}, {s=}")
    特定这个问题,这里是 d 里面有个 U+2029 Paragraph Separator
    参考: https://www.compart.com/en/unicode/U+2029

    不单纯考虑这个问题的话
    Unicode 有 NFKC 、NFKD 、NFC 和 NFD 四种正规形式,参考:《 Unicode 等价性》 https://zh.wikipedia.org/wiki/Unicode%E7%AD%89%E5%83%B9%E6%80%A7 但这块 CJK 比较少见
    除此以外,Unicode 本身有错,同形没合并的不少,常用字也偶有这种情况,繁体、中简、日简尤其严重。(有时会觉得,不如不要 CJK,这样多种字体并用也很容易,不需要 <html lang=...> 这种东西。)
    kkzxak47
        13
    kkzxak47  
       2021 年 5 月 7 日 via Android
    “格式转换”这种事情应该让你的数据变得更好处理,然而现在变得更难处理,所以应该修改之前的处理步骤,而不是进入到一个失控的状态再来想办法。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5095 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 03:57 PVG 11:57 LAX 19:57 JFK 22:57
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86