You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Pandas匹配子串时空格、特殊字符导致识别失败的问题

问题解答

1 代码调整方案

核心思路:对匹配双方做统一的归一化处理,消除空格、特殊符号、大小写的差异,再做子串匹配。同时先修复原有代码的显性bug:app_list中Amazon Prime Video后漏写逗号,导致和后一项Google Photos拼接为单个字符串,匹配失效。

修正后的完整可运行代码如下:

import pandas as pd
import numpy as np
import re

# 字符串归一化函数:移除所有非字母数字字符,统一转小写
def normalize_str(s):
    return re.sub(r'[^a-z0-9]', '', s.lower())

data = ['-Net flix_ios_App-"',
        '--You_tube_',
        '..Tik_Tok_5dgj_USA',
        '-AmazonMusic: Songs& Podcast_95ikj_eu',
        'My FitnessPal_Fds34',
        'Tidalmusic_ios_and',
        '--AmazonPrime_)ofi9_aus',
        '--AS_Googlephotos_43ks_id3']

df = pd.DataFrame(data, columns=["campaign_name"])
# 修复原app_list漏写逗号的bug
app_list = ['Netflix',
            'YouTube',
            'TikTok',
            'Amazon Music: Songs & Podcasts',
            'MyFitnessPal',
            'Tidal Music',
            'Amazon Prime Video',
            'Google Photos']

# 生成归一化后的匹配关键词列表
norm_app_keywords = [normalize_str(app) for app in app_list]
# 提前对campaign_name做归一化,避免循环中重复计算
norm_campaign = df["campaign_name"].apply(normalize_str)

# 生成匹配条件
match_conditions = [norm_campaign.str.contains(keyword) for keyword in norm_app_keywords]
df["new_name"] = np.select(match_conditions, app_list, default="New app")

运行后所有案例均可正确匹配:比如--AmazonPrime_)ofi9_aus归一化后为amazonprimeofiaus,可命中Amazon Prime Video归一化后的关键词amazonprimevideo;--AS_Googlephotos_43ks_id3归一化后为asgooglephotos43ksid3,可命中Google Photos归一化后的关键词googlephotos。

2 两种实现方式对比

np.select的方案明显更优,核心原因有2点:

  • 可维护性更强:如果后续需要新增/删除匹配的app,只需要修改app_list即可,不需要调整逻辑结构;嵌套np.where每加一个匹配项就要多套一层,超过3层之后可读性极差,很容易出现括号配对错误。
  • 性能差异极小:两者底层都是向量化运算,运行效率几乎没有差别,但是np.select的代码更简洁清晰,符合Python可读性优先的编码规范。

内容的提问来源于stack exchange,提问作者doubledribble

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 09:54:05