我正在尝试使用 pandas.Series.str.replace() 方法替换字符串的特定部分,使用正则表达式来定义我想要更改的部分,根据文档,您可以使用正则表达式甚至 re。编译对象。我只是不知道我做错了什么,但我似乎只是完全删除,而不是替换部分字符串。
因此,在我的 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,'')
不幸的是,这只是完全删除了日期,在我的['dates']列中留下了''。根据文档,这些 re.compile 对象是被接受的,如果我使用 re.findall() 那么正则表达式字符串将从该日期获取我想要的部分,所以我只能假设我不能在此方法中以相同的方式使用它们。我可以做一些调整来完成这项工作吗?
最佳答案
问题是您的正则表达式匹配整个字符串,因此整个字符串被空字符串替换。相反,您需要的是捕获字符串中感兴趣的数字,并将匹配项替换为捕获的日期值:
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'
部分分别指的是第一、第二和第三个捕获组,它们(使用修改后的模式)指的是您所要的值如果字符串只能在日期组件之间包含连字符,那么我建议完全匹配该字符 (-
),而不是任何字符 (.
)。
如果您真的想坚持使用“匹配并删除”方法,您可以编写一个正则表达式来捕获“连字符或以空格开头的任何内容”:
re_express = re.compile('-| .*')
df['date'] = df['date'].str.replace(re_express, '')
但显式优于隐式,前一种方法将更可靠地确保格式错误的数据不会以意想不到的方式被静默截断。
关于python - 如何将正则表达式与 pandas.Series.str.replace() 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52938522/