两个字符串比较的问题 Python

2021-05-06 11:36:53 +08:00
 vegetableChick

xdm,遇到一个问题。

背景:

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

问题:

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

d = "进
出口中心"
s = "进出口中心"

print(d == s)

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

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

2536 次点击
所在节点    Python
13 条回复
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
2021-05-06 11:48:52 +08:00
@Te11UA `- ) ( , .`会有这些符号
Te11UA
2021-05-06 11:52:14 +08:00
@vegetableChick #2 自己加正则不就行了
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
2021-05-06 13:11:24 +08:00
Python Cookbook 第二章第九节
mekingname
2021-05-06 13:45:57 +08:00
@bytesfold normalize 并不能移除`\u2029`这个零宽字符。
NoAnyLove
2021-05-06 13:49:56 +08:00
^ 2.12
Ug24m31
2021-05-06 15:54:41 +08:00
某些部首的问题,github 上有康熙部首替换字典
delectate
2021-05-06 16:42:55 +08:00
有个比较骚的操作,放弃效率,但是获得准确性。

字符串转图片,放在内存,然后图片对比 ssim 。
vegetableChick
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
2021-05-06 19:13:45 +08:00
长得一样, Unicode 不一样.
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
2021-05-07 12:55:46 +08:00
“格式转换”这种事情应该让你的数据变得更好处理,然而现在变得更难处理,所以应该修改之前的处理步骤,而不是进入到一个失控的状态再来想办法。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/775121

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX