regex 我怎样用python把这个对话分成每一行,

jvidinwx  于 2023-03-09  发布在  Python
关注(0)|答案(2)|浏览(88)

假设下面的字符串是一行的内容,列名为“body”,现在我想从这个字符串中为每个发言人创建一行。

**Helper:**您好,我是虚拟助手Helper,今天有什么可以为您效劳的?您是否在询问:电子书有声读物购买订阅电影等
**Cx说:**电影

预期输出应如下所示:
| 发言人|成绩单|
| - ------|- ------|
| 助手|你好,我是虚拟助手助手,我今天能为你做些什么?您是否询问:电子书有声读物购买订阅电影等|
| 残雪说|电影|
我试过这个但是

Testresult = tempchatdf.body.str.split(":\*\*",expand = True)
jogvjijk

jogvjijk1#

您可以只使用strsplit(":")

split = string.split(":")
result = [split[0], ":".join(split[1:])]

这将第一次拆分,并使扬声器(第0个索引)将拆分的其余部分与“:“组合。这样做是为了确保任何额外的“:“返回。
如果字符串包含几行这样的语句,你可以把它放在一个循环中。

table = []
for line in string:
    split = string.split(":")
    table.append([split[0], ":".join(split[1:])])
iugsix8n

iugsix8n2#

下面是使用re.findall()匹配body字符串并创建新df的方法

row_str = df["body"].values[0]
data = re.findall(r'(.+?):\s*(.+)', row_str)

new_df = pd.DataFrame(data, columns=["Speaker", "Transcript"])
print(new_df)

或者可以在列表解析中将re与pandas.DataFrame.explode一起使用

pattern = r'^([a-zA-Z\s]+):'
rows = [{"Speaker": re.match(pattern, line).group(1).strip(), 
         "Transcript": line.split(":", 1)[1].strip()}
         for line in df["body"].str.split("\n").explode().tolist()
         if re.match(pattern, line)]

new_df = pd.DataFrame(rows)
print(new_df)

| 发言人|成绩单|
| - ------|- ------|
| 助手|你好,我是虚拟助手助手,我今天能为你做些什么?您是否询问:电子书有声读物购买订阅电影等|
| 残雪说|电影|

相关问题