xdm,遇到一个问题。
需要比较两个字符串是否相等, 无视中英文标点符号
通过replace
等格式转换之后, 比较两个字符串
d = "进
出口中心"
s = "进出口中心"
print(d == s)
但是两个看起来一样的字符串不相等, 第一个中间出现了特殊字符
如何把这种特殊符号处理掉,然后按相同去判断?
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) ``` |
2
vegetableChick OP @Te11UA `- ) ( , .`会有这些符号
|
3
Te11UA 2021-05-06 11:52:14 +08:00
@vegetableChick #2 自己加正则不就行了
|
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("^") == "^",与注释不符 |
5
bytesfold 2021-05-06 13:11:24 +08:00
Python Cookbook 第二章第九节
|
6
mekingname 2021-05-06 13:45:57 +08:00
@bytesfold normalize 并不能移除`\u2029`这个零宽字符。
|
7
NoAnyLove 2021-05-06 13:49:56 +08:00
^ 2.12
|
8
Ug24m31 2021-05-06 15:54:41 +08:00
某些部首的问题,github 上有康熙部首替换字典
|
10
vegetableChick OP |
11
l4ever 2021-05-06 19:13:45 +08:00
长得一样, Unicode 不一样.
|
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=...> 这种东西。) |
13
kkzxak47 2021-05-07 12:55:46 +08:00 via Android
“格式转换”这种事情应该让你的数据变得更好处理,然而现在变得更难处理,所以应该修改之前的处理步骤,而不是进入到一个失控的状态再来想办法。
|