我试图用pandas.Series.str.replace()方法替换字符串的特定部分,使用regex来定义我想要更改的部分,根据您可以使用正则表达式甚至re.compile对象的文档。我不知道我做错了什么,但我似乎完全抹去了,而不是替换字符串的一部分。
因此,在我的DataFrame中,假设我有一个名为“dates”的列,它的格式如下:
'2016-03-26 17:47:46'我只想获取破折号、空间和时间(将8位数字作为日期),然后将它们替换为“希望留下20160326”,因此我创建了一个re.compile对象来抓取这些数据:
re_express = re.compile('[\d]{4}(.)[\d]{2}(.)[\d]{2}(.*)')然后,我尝试用这一行替换它们:
df['date'] = df['date'].str.replace(re_express,'')不幸的是,这只是完全抹去了日期,在我的“日期”栏中留下了“日期”。这些re.compile对象根据文档被接受,如果我使用re.findall(),那么regex字符串将从那个日期起获取我想要的部分,所以我只能假设我不能在这个方法中以同样的方式使用它们。我能做些调整让这件事成功吗?
发布于 2018-10-22 22:28:20
问题是正则表达式与整个字符串匹配,因此整个字符串被空字符串替换。相反,您需要的是捕获您的字符串中感兴趣的数字,并将匹配替换为捕获的日期值:
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来捕获“连字符或任何以空格开头的内容”:
re_express = re.compile('-| .*')
df['date'] = df['date'].str.replace(re_express, '')但是显式比隐式更好,而前一种方法将更可靠地确保格式错误的数据不会以意外的方式被截断。
https://stackoverflow.com/questions/52938522
复制相似问题