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

