如何在DataFrame中移除品牌名列表匹配项及之前的所有内容
解决方案
问题分析
你之前的代码存在两个核心问题:
- 第一种写法里,正则表达式未正确嵌入品牌列表变量,还存在引号不匹配的语法错误;
- 第二种写法仅匹配品牌名本身,没有覆盖前面的数量、单位内容,无法完全删除目标部分。
正确实现方式
我们需要构造正则表达式,匹配**从字符串开头到任意品牌名结束(含品牌名及后续空格)**的所有内容,再通过替换或提取得到纯商品名,两种方式都能实现需求:
方法1:使用str.replace替换目标内容
variations = ['Cushelle', 'Charmin', 'Tesco', 'Sainsburys'] # 构造正则模式:匹配开头到任意品牌名+后续空格的所有内容 pattern = fr'^.*?(?:{"|".join(variations)})\s*' # 替换为空字符串,得到纯商品名 data['item_name'] = data['item'].str.replace(pattern, '', regex=True)
方法2:使用str.extract直接提取商品名(更直观)
variations = ['Cushelle', 'Charmin', 'Tesco', 'Sainsburys'] # 构造正则模式:提取任意品牌名+空格之后的所有内容 pattern = fr'(?:{"|".join(variations)})\s*(.*)' # 提取匹配到的分组内容,得到纯商品名 data['item_name'] = data['item'].str.extract(pattern, expand=False)
代码说明
fr'^.*?(?:{"|".join(variations)})\s*':^.*?:非贪婪匹配从字符串开头到目标内容的所有字符;(?:{"|".join(variations)}):用|拼接所有品牌名作为匹配目标(?:表示非捕获分组,不保留品牌名本身);\s*:匹配品牌名之后的任意空格,确保商品名前无多余空格。
- 若需忽略大小写(比如品牌名存在小写变体),可添加
flags=re.IGNORECASE:import re data['item_name'] = data['item'].str.replace(pattern, '', regex=True, flags=re.IGNORECASE)
内容的提问来源于stack exchange,提问作者ds_1234
相关产品推荐
相关产品推荐

