如何使用正则表达式将特定的子字符串提取到新行中?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用正则表达式将特定的子字符串提取到新行中?相关的知识,希望对你有一定的参考价值。

我有一个数据框,其中包含用户和客户代理之间的完整聊天。我只想从用户中提取消息,并使用相同的票证ID从他们创建新行:

ticket_id = pd.DataFrame(["1","2"]).rename(columns=0:"Ticket-ID")
full_chat = pd.DataFrame([
   "User foo foo foo 12:12 PM, Agent bar bar bar 12:12 PM, User foo foo 12:13 
    PM, Agent bar bar 12:13 PM, User foo 12:14 PM, Agent bar 12:14 PM", 

   "User bar bar bar 12:12 PM, Agent foo foo foo 12:12 PM, User bar bar 12:13 
    PM"
    ]).rename(columns=0:"Full-Chat")


merge_chat = pd.merge(ticket_id, full_chat, left_index=True, right_index=True, how='outer')


def _split_row(text):
    cleaned_text = text.lower()

    lines = re.findall(r"\b\w*user\b\ (.*?)\ *\d\d:\d\d*", cleaned_text)        

    for line in lines:
        print(line.split())

print(merge_chat["Full-Chat"].apply(_split_row))

我希望它像:

Ticket-ID      Full-Chat
1              foo foo foo
1              foo foo
1              foo
2              bar bar bar
2              bar bar
答案

IIUC,

merge_chat['Full-Chat'] = merge_chat['Full-Chat'].apply(lambda i: re.findall(r"\b\w*user\b\ (.*?)\ *\d\d:\d\d*", i.lower()))

从熊猫0.25.0起,

merge_chat.explode(column='Full-Chat')

将为您提供结果

在0.25.0之前的版本中,

df = pd.DataFrame(merge_chat['Full-Chat'].tolist(), index=merge_chat['Ticket-ID']).stack()
df = df.reset_index([0, 'Ticket-ID'])
df.rename(columns=0:'Full-Chat', inplace=True)
df
  Ticket-ID Full-Chat
0   1   foo foo foo
1   1   foo foo
2   1   foo
3   2   bar bar bar
4   2   bar bar

以上是关于如何使用正则表达式将特定的子字符串提取到新行中?的主要内容,如果未能解决你的问题,请参考以下文章

Java使用正则表达式提取字段分隔的子字符串

如何在 Python 中使用正则表达式提取 JSON 字符串的特定部分?

如何使用正则表达式从熊猫数据框中的一行中的字符串中提取所有特定值?

如何使用正则表达式提取此字符串的坐标的 3 个数值,无论它们是正数值坐标还是负数值坐标

C++ 正则表达式提取子字符串

使用正则表达式从句子中的方括号中提取剩余的子字符串