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

pandas.Series.str.replace返回NaN:正则匹配正常却替换失败

问题分析与解决

你的str.replace返回NaN的核心原因是repl参数中的lambda函数写法错误:

你写的''.join('Jan/1/', m.groups()[0])不符合Python字符串join方法的语法——join仅接受一个可迭代对象(比如列表、元组)作为参数,你传入了两个独立参数,执行时会抛出TypeError,导致pandas返回NaN。

另外,你的正则表达式(?:[^/])(\d{4}\b)会匹配「非/字符+四位数字」的整体(比如原文本中的~2006会被完整匹配),替换后会把前缀的~也替换掉,如果你想保留这类前缀字符,也需要调整正则逻辑。


修正方案

方案1:修正lambda的字符串拼接逻辑

直接用+拼接字符串,避免错误使用join:

df.str.replace(
    pat=r'(?:[^/])(\d{4}\b)', 
    repl=lambda m: 'Jan/1/' + m.group(1), 
    regex=True
)

方案2:正确使用join方法(可选)

如果坚持用join,需要把要拼接的内容放入一个可迭代对象中:

df.str.replace(
    pat=r'(?:[^/])(\d{4}\b)', 
    repl=lambda m: ''.join(['Jan/1/', m.group(1)]), 
    regex=True
)

方案3:保留前缀字符的正则调整(如果需要)

如果你想保留年份前的非/字符(比如原文本中的~),可以用正向先行断言调整正则,只匹配符合条件的四位数字:

df.str.replace(
    pat=r'(?<![/])\b(\d{4})\b', 
    repl=lambda m: 'Jan/1/' + m.group(1), 
    regex=True
)

这个正则会匹配「前面不是/的四位数字」,替换后原文本中的~2006会变成~Jan/1/2006。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 21:10:20