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
相关产品推荐
相关产品推荐

