Python中如何基于正则分割跨多行文本并保留分隔符
解决方案
可以通过非贪婪匹配+正向预查的正则表达式结合re.findall实现,既保留开头的时间戳分隔符,又能完整捕获跨多行的消息内容,无需手动合并数组。
优化后的正则与代码实现
把原正则里的.{1}替换为[-:](精准匹配冒号或横杠,避免匹配无关字符),配合非贪婪匹配和正向预查:
import re pattern = r"\[[0-9]{2}[-:][0-9]{2}\].*?(?=\[[0-9]{2}[-:][0-9]{2}\]|$)" text = """ [04:29] [All] Player1 (Hecarim); tariane test + [04:41] [All] Player1 (Hecarim); ?ariane test [05:07] [All] Player1 (Hecarim); ?ariane test it haha [07-04] Player1 (Hecarim) dddddddddddddddddddddddddddddddddddddddddddddddddddddd [07:08] Player1 (Hecarim) ddddddddddddddddddddddddddddddddddddddddddddddddddddddddd ddddddddddddddddddddd """ messages = re.findall(pattern, text, re.DOTALL) # 过滤空白元素,得到干净的消息数组 messages = [msg.strip() for msg in messages if msg.strip()] print(messages)
关键逻辑说明
\[[0-9]{2}[-:][0-9]{2}\]:精准匹配开头的时间戳格式([XX:XX]或[XX-XX]).*?:非贪婪匹配任意字符(包括换行,因为加了re.DOTALL参数),避免过度匹配到下一条消息(?=\[[0-9]{2}[-:][0-9]{2}\]|$):正向预查,指定匹配终止条件是下一个时间戳或者文本结尾,确保每条消息被完整分割
内容的提问来源于stack exchange,提问作者lyeaf
相关产品推荐
相关产品推荐

