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

Python replace函数不生效求助(已重新赋值变量)

问题:Pandas中str.replace无法移除标题中的年份括号

执行替换前,DataFrame的title列包含类似"Toy Story (1995)"的内容,运行以下代码后,标题中的"(年份)"部分并未被移除:

movies_df['year'] = movies_df.title.str.extract('(\(\d\d\d\d\))',expand=False)
movies_df['year'] = movies_df.year.str.extract('(\d\d\d\d)',expand=False)

movies_df['title'] = movies_df['title'].str.replace('(\(\d\d\d\d\))', '')
movies_df['title'] = movies_df['title'].apply(lambda x: x.strip())

movies_df.head()

替换后的结果显示title列仍保留了"(年份)"后缀,替换未生效。


解决办法

问题出在Pandas版本的默认参数变化:从Pandas 1.4.0开始,str.replace()的默认参数regex=False,即会把第一个参数当作普通字符串而非正则表达式匹配。你写的正则表达式'(\(\d\d\d\d\))'会被当成普通文本去匹配,自然找不到对应内容。

方案1:显式添加regex=True参数

修改替换标题的代码,明确告诉Pandas按正则解析:

movies_df['title'] = movies_df['title'].str.replace(r'\(\d{4}\)', '', regex=True)
movies_df['title'] = movies_df['title'].str.strip()  # 用str.strip()比apply更高效

这里把正则简化为r'\(\d{4}\)',用原始字符串r''避免转义混乱,\d{4}匹配四位数字,效果和你原来的\d\d\d\d一致。

方案2:一步完成年份提取+标题清理

可以用str.extract()一次性拆分标题和年份,更简洁高效:

# 提取标题(括号前的内容)和年份(括号内的四位数字)
movies_df[['title', 'year']] = movies_df['title'].str.extract(r'(.*?)\s*\((\d{4})\)', expand=True)
# 清理标题两端空格
movies_df['title'] = movies_df['title'].str.strip()

这个正则的意思是:

  • (.*?):非贪婪匹配括号前的所有内容(即标题主体)
  • \s*:匹配标题和括号之间的任意空格
  • (\d{4}):匹配括号内的四位数字(即年份)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 04:12:40