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-05-06 11:36:53 +08:00 · 2742 次点击
    这是一个创建于 1295 天前的主题,其中的信息可能已经有所发展或是发生改变。

    xdm,遇到一个问题。

    背景:

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

    问题:

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

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

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

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

    13 条回复    2021-05-07 12:55:46 +08:00
    Te11UA
        1
    Te11UA  
       2021-05-06 11:42:15 +08:00
    ```
    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-05-06 11:48:52 +08:00
    @Te11UA `- ) ( , .`会有这些符号
    Te11UA
        3
    Te11UA  
       2021-05-06 11:52:14 +08:00
    @vegetableChick #2 自己加正则不就行了
    no1xsyzy
        4
    no1xsyzy  
       2021-05-06 13:07:37 +08:00
    通常来说是根据可打印与否来分析 ''.join(c for c in d if c.isprintable())
    但如果空格也不需要的话,对每个字符 strip 也可 ''.join(c.strip() for c in d)
    具体情况,具体分析

    @Te11UA 一个 [] 里面只需要一个 ^ 就行。你现在这个代码 filter_str("^") == "^",与注释不符
    bytesfold
        5
    bytesfold  
       2021-05-06 13:11:24 +08:00
    Python Cookbook 第二章第九节
    mekingname
        6
    mekingname  
       2021-05-06 13:45:57 +08:00
    @bytesfold normalize 并不能移除`\u2029`这个零宽字符。
    NoAnyLove
        7
    NoAnyLove  
       2021-05-06 13:49:56 +08:00
    ^ 2.12
    Ug24m31
        8
    Ug24m31  
       2021-05-06 15:54:41 +08:00
    某些部首的问题,github 上有康熙部首替换字典
    vegetableChick
        10
    vegetableChick  
    OP
       2021-05-06 18:13:23 +08:00
    @NoAnyLove @Te11UA @Ug24m31 @bytesfold @delectate @mekingname @no1xsyzy 感谢大家 暂时使用 @no1xsyzy 这种方法 `''.join(c for c in d if c.isprintable())` 顺便问一下 这种问题一般是什么原因导致的?
    l4ever
        11
    l4ever  
       2021-05-06 19:13:45 +08:00
    长得一样, Unicode 不一样.
    no1xsyzy
        12
    no1xsyzy  
       2021-05-07 00:11:49 +08:00
    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-05-07 12:55:46 +08:00 via Android
    “格式转换”这种事情应该让你的数据变得更好处理,然而现在变得更难处理,所以应该修改之前的处理步骤,而不是进入到一个失控的状态再来想办法。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1556 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 17:02 · PVG 01:02 · LAX 09:02 · JFK 12:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.