为何用十六进制\x42搜索字符串无法匹配星号字符?
问题原因与解决方法
首先你犯了一个关键错误:\x42并不是星号*的ASCII十六进制编码。
正确的ASCII对应关系
#的ASCII十进制是35,十六进制为23,所以\x23确实对应#,这也是你能匹配到目标行的原因。*的ASCII十进制是42,对应的十六进制是2A,而\x42对应的是大写字母B——你的DataFrame里根本没有包含B的行,自然返回空结果。
正确的十六进制匹配写法
用\x2A代替\x42,就能正常匹配到带*的行:
print(df.loc[ df['foo'].str.contains('\x2A') ])
执行后会得到预期输出:
id foo 1 1 2* 3 3 4*
补充:直接用\*能成功的原因
因为*在正则表达式中是特殊元字符(表示匹配前一个元素0次或多次),所以你需要用\*转义它,让它被当作普通字符处理。如果你不想用正则,也可以给contains传入regex=False参数,直接搜索原字符:
print(df.loc[ df['foo'].str.contains('*', regex=False) ])
内容的提问来源于stack exchange,提问作者user15260458
相关产品推荐
相关产品推荐

