Pandas: str 提取除字符串最后一部分以外的所有内容

Pandas: str extract text every thing except the last part of the string

我有一个数据框,其中有一列称为 "msg"。

在 "msg" 列中,所有行如下所示。用户 xxxx 的长度为 6 或 7 个字符。 xx.xx.xx.xx 和 yy.yy.yy.yy 是 ip 地址,因此每个八位字节可以是 1 位或 3 位。

User xxxxxx is attempting to restart primary host xxx.xx.xxx.xx (id=1) for managed host yyy.yy.yyy.yy (id=4) at Dec 30, 2019, 6:08:87 PM

我需要一个规则来提取 "at Dec 30, 2019, 6:08:87 Pm" 之前每个单元格中的所有内容?即我想删除 "at \w\w\w \d\d, \d\d\d\d, \d:\d\d:\d\d ....."

之后的所有字符

我现在的代码如下,但是不知道pat怎么填。

Test = df['msg'].str.extract(pat='...')

回复以下评论: 马修:是的。第二个(id=xx)之后的格式相同。 乔恩:任何一种方式都可以。

您可以在此处使用积极的前瞻性正则表达式:

Test = df['msg'].str.extract(pat='^.*(?=\s+at [A-Za-z]{3} \d{2}, \d{4}, [\d:]+ (?:AM|PM)$)')

这是一个显示上述模式有效的正则表达式演示:

Demo

string='I ate an apple (id=1) and an orange (id=4) at Dec 30, 2019, 6:08:87 PM'
string = string[:string.rfind('at')]

这里,我猜'at'这个词应该在日期之前。因此,我所做的是使用 rfind() 找到 'at' 的 last_occurence 并将字符串

切片

请尝试

df.msg.str.extractall('(?<=\s)([a-z]*\s[A-Z0-9]\S*\s[0-9,].+)')

说明

(?<=\s) space 后跟小写 aphas 和 space [a-z]*\s 和大写字母数字 [A-Z0-9] 之后的任何表达式 并且字母数字可能匹配非白色space \S 并且可能匹配一个字符串 white space 贪婪地向左零次或多次 *\s 并且也可能有数字介于 0-9 和逗号 [0-9,] 之间的字符串,并且如果存在此模式则匹配这些字符除了终止符贪婪地向左零次或多次.+