You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用正则拆分对话字符串结果不符的问题排查

正则表达式拆分对话的问题分析

场景与需求

给定对话字符串:

person alpha:
How are you today?

person beta:
I'm fine, thank you.

person alpha:
What's up?

person beta:
Not much, just hanging around.

期望拆分后得到包含完整发言块的列表:

["person alpha:\nHow are you today?", "person beta:\nI'm fine, thank you.", "person alpha:\nWhat's up?", "person beta:\nNot much, just hanging around."]

尝试的代码与错误结果

使用以下代码:

import re
res = re.split('person alpha |person beta |\*|\n', s)

得到的结果是:

['person alpha:', 'How are you today?', '', 'person beta:', "I'm fine, thank you.", '', 'person alpha:', "What's up?", '', 'person beta:', 'Not much, just hanging around.']

正则表达式存在的问题

  • 拆分逻辑完全错误:re.split是将匹配到的内容作为分隔符拆分字符串,且会丢弃分隔符,但你需要保留的是「发言者+对应内容」的完整块,用split从根本上不符合需求,应该用re.findall来提取目标内容。
  • 错误将换行符列为拆分规则:原对话中,发言者行和内容行之间的换行是需要保留的(比如person alpha:\nHow are you today?是一个整体),但你把\n加入拆分规则,导致每一行被单独拆分,还因连续两个换行产生了空字符串元素。
  • 发言者匹配规则不匹配原格式:正则里写的person alpha (带空格)和原字符串中person alpha:(带冒号、无空格)的格式不符,无法识别完整的发言者标识,反而把发言者行和内容行强行拆分开。
  • 冗余的\*匹配规则:原字符串中没有星号字符,这个规则完全多余,既不起作用还增加了正则的复杂度。

修正方案示例

改用re.findall提取完整发言块,正则匹配从person alpha:或person beta:开始,到下一个发言块前的换行或字符串结尾的内容:

import re
s = """person alpha:
How are you today?

person beta:
I'm fine, thank you.

person alpha:
What's up?

person beta:
Not much, just hanging around."""
res = re.findall(r'person (?:alpha|beta):\n.*?(?=\n\n|$)', s)
print(res)

运行结果符合预期:

["person alpha:\nHow are you today?", "person beta:\nI'm fine, thank you.", "person alpha:\nWhat's up?", "person beta:\nNot much, just hanging around."]

内容的提问来源于stack exchange,提问作者BlackHawk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 01:55:18