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

使用Pandas str.extract正则拆分文本列失败,请求错误排查及解决方案

问题描述

我需要将DataFrame中名为Text列的内容按—(中文破折号)拆分为两列Text1和Text2,原始数据如下:

Text
19 hours ago — Catch up on key developments an...
8 hour ago — Catch up on key developments an...
10 minutes ago — Catch up on key developments an...
1 day ago — Catch up on key developments an...

预期拆分后的结果:

Text1          Text2
19 hours ago   Catch up on key developments an...
8 hour ago     Catch up on key developments an...
10 minutes ago Catch up on key developments an...
1 day ago      Catch up on key developments an...

我尝试了以下代码,但没有生效:

df[['Text1', 'Text2']] = df['Text'].str.extract(r"(\d+ \w+, \d{5})?\s*\—?\s*(.*)", expand=True)

希望有正则使用经验的朋友帮忙指出错误并提供解决方案。


解决方案

嘿,我来帮你排查这个问题~你的正则表达式和数据完全不匹配,所以才没生效,咱们一步步来:

先说说你代码里的问题

你写的正则r"(\d+ \w+, \d{5})?\s*\—?\s*(.*)"完全没贴合你的数据格式:

  • 第一个分组(\d+ \w+, \d{5})是在匹配类似12 abc, 12345的格式,但你的时间是19 hours ago这种结构,根本对不上;
  • 你把分隔符—设成了可选(?),但你的每条数据里都有这个破折号,完全没必要;
  • 整体逻辑和你要拆分的目标完全偏离,自然提取不到正确内容。

给你两种靠谱的解决方案

方法1:用str.split(更简单高效,推荐)

因为你的数据是明确用**中文破折号—**分隔的,直接用split就够了,不用搞复杂的正则:

df[['Text1', 'Text2']] = df['Text'].str.split(r"\s*—\s*", expand=True, n=1)
  • \s*—\s*:自动忽略分隔符前后的空格,保证拆分出来的Text1和Text2没有多余空白;
  • n=1:只拆分一次,就算后面的描述里出现破折号也不会被误拆。

方法2:用str.extract(正则方式)

如果你一定要用正则提取,那得写个贴合数据的正则:

df[['Text1', 'Text2']] = df['Text'].str.extract(r"(.*?)\s*—\s*(.*)", expand=True)
  • (.*?):非贪婪匹配破折号之前的所有内容(也就是你的时间部分);
  • \s*—\s*:匹配分隔符和前后的空格;
  • (.*):匹配破折号之后的所有内容(也就是描述部分)。

随便选一种方法运行,就能得到你想要的拆分结果啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 19:04:09