为什么向前看是为时间戳返回匹配

时间:2016-09-21 14:13:49

标签: python regex

尝试在python中编写脚本以进行一些后期处理。我有一个文件,其中包含带有时间戳的邮件。我想将所有消息提取到列表中 正则表达式 - 从消息开始直到下一个时间戳。

findallItems = re.findall(r'(?s)((?<=message).*?(?=((\d{4})\-((0[1-9])|(1[0-2]))\-((0[1-9])|(1[0-2]))|\Z)))', fileread)

这样可以正常工作,但它也会将时间戳作为匹配返回。我怎样才能返回邮件而不包括时间戳?

如果我将前瞻位置用作文本,那么它可以正常工作。例如

findallItems = re.findall(r'(?s)((?<=message).*?(?=message|\Z))',fileread)

1 个答案:

答案 0 :(得分:1)

您需要删除不必要的捕获括号并将其他括号转换为非捕获:

2.2.x-dev

请参阅this regex demo

但是,您可以将1个捕获组保留在必要的模式上,findallItems = re.findall(r'(?s)(?<=message).*?(?=(?:\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-2])|\Z))', fileread) 只会返回此组值:

re.findall

请参阅another regex demo