使用Pandas str.contains()时出现不符合预期的结果
Pandas str.contains()匹配含加号字符串失败的原因及解决方法
问题场景
我有一个包含字符串列的Pandas DataFrame,想要筛选出包含HELLO + WORLD的所有行,但调用str.contains()方法时,大部分行返回False;而匹配HELLO / WORLD时前3行能正常返回True。
示例代码
import pandas as pd df = pd.DataFrame({ 'AREA': ["HELLO / WORLD"] * 3 + ["HELLO + WORLD"] * 200 }) print(df['AREA'].str.contains("HELLO + WORLD")) print(df['AREA'].str.contains("HELLO / WORLD"))
实际输出
0 False 1 False 2 False 3 False 4 False ... 198 False 199 False 200 False 201 False 202 False Name: AREA, Length: 203, dtype: bool 0 True 1 True 2 True 3 False 4 False ... 198 False 199 False 200 False 201 False 202 False Name: AREA, Length: 203, dtype: bool
原因
str.contains()默认采用正则表达式匹配模式,而+是正则中的特殊元字符,代表前面的字符(这里是空格)出现1次或多次,不是字面意义上的加号。所以你的匹配串"HELLO + WORLD"被解析为找HELLO后接1个以上空格再跟WORLD的字符串,自然匹配不到带+的目标行。
而/不属于正则特殊字符,所以"HELLO / WORLD"能正常匹配对应行。
解决方法
方法1:关闭正则匹配
给str.contains()传入regex=False参数,强制方法按字面字符串匹配,不解析正则元字符:
# 正确匹配含HELLO + WORLD的行 df['AREA'].str.contains("HELLO + WORLD", regex=False)
方法2:转义正则特殊字符
如果需要保留正则匹配功能(比如后续要用到复杂正则),可以手动转义+,或者用re.escape()自动转义所有正则特殊字符:
# 手动转义+ df['AREA'].str.contains("HELLO \\+ WORLD") # 用re.escape自动转义所有特殊字符 import re df['AREA'].str.contains(re.escape("HELLO + WORLD"))
验证结果
用方法1修改代码后,输出会显示前3行(HELLO / WORLD)为False,后面200行(HELLO + WORLD)为True,符合预期。
内容的提问来源于stack exchange,提问作者mentejoao
相关产品推荐
相关产品推荐

