首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在pandas.Series.str.replace()中使用regex

如何在pandas.Series.str.replace()中使用regex
EN

Stack Overflow用户
提问于 2018-10-22 22:23:11
回答 1查看 3.7K关注 0票数 1

我试图用pandas.Series.str.replace()方法替换字符串的特定部分,使用regex来定义我想要更改的部分,根据您可以使用正则表达式甚至re.compile对象的文档。我不知道我做错了什么,但我似乎完全抹去了,而不是替换字符串的一部分。

因此,在我的DataFrame中,假设我有一个名为“dates”的列,它的格式如下:

代码语言:javascript
运行
复制
'2016-03-26 17:47:46'

我只想获取破折号、空间和时间(将8位数字作为日期),然后将它们替换为“希望留下20160326”,因此我创建了一个re.compile对象来抓取这些数据:

代码语言:javascript
运行
复制
re_express = re.compile('[\d]{4}(.)[\d]{2}(.)[\d]{2}(.*)')

然后,我尝试用这一行替换它们:

代码语言:javascript
运行
复制
df['date'] = df['date'].str.replace(re_express,'')

不幸的是,这只是完全抹去了日期,在我的“日期”栏中留下了“日期”。这些re.compile对象根据文档被接受,如果我使用re.findall(),那么regex字符串将从那个日期起获取我想要的部分,所以我只能假设我不能在这个方法中以同样的方式使用它们。我能做些调整让这件事成功吗?

EN

Stack Overflow用户

发布于 2018-10-22 22:28:20

问题是正则表达式与整个字符串匹配,因此整个字符串被空字符串替换。相反,您需要的是捕获您的字符串中感兴趣的数字,并将匹配替换为捕获的日期值:

代码语言:javascript
运行
复制
import pandas as pd
df = pd.DataFrame({'date':['2016-03-26 17:47:46', '2018-03-26 17:47:46']})
re_express = re.compile('([\d]{4}).([\d]{2}).([\d]{2}).*')
df['date'] = df['date'].str.replace(re_express, r'\1\2\3')

注意,r'\1\2\3'部分分别引用了第一个、第二个和第三个捕获组,它们(使用修改的模式)精确地引用了您感兴趣的值。如果字符串只能包含日期组件之间的连字符,那么我建议完全匹配该字符串(-),而不是任何字符(.)。

如果您真的想坚持“匹配并删除”方法,可以编写regex来捕获“连字符或任何以空格开头的内容”:

代码语言:javascript
运行
复制
re_express = re.compile('-| .*')
df['date'] = df['date'].str.replace(re_express, '')

但是显式比隐式更好,而前一种方法将更可靠地确保格式错误的数据不会以意外的方式被截断。

票数 3
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52938522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档