我无法找到我所拥有的正则表达式问题的解决方案。这实际上是对这篇文章的一个跟进问题: Find string between two substrings AND between string and the end of file
我创建了以下示例文本(在我的应用程序中,文本更长,多个文件等):
课程22/09/2010 1.早期职责Josephine,Jansen 22-09-2010 10:37:08 日期22/09/2010责任1.早期任务1.3这里可能还有其他一些 相关内容Nursegoals Interventions Record现在是第四个 注意。 6.2.1.3混淆:观察。护士干预记录 这是一个新的,注意(再次),我称之为注释3.课程22/09/2010 1。 早期工作记录这又是一个注释,我称之为注2。Apple: 0 /更少课程22/09/2010 3. Nightduty Josephine,Jansen 22-09-2010 06:22:25 Date 22/09/2010课程3. Nightduty 1.3此处还有其他内容 Nursegoals Interventions Record 6.2.1.3 Confusion:Observing。 Nursegoals Interventions Record Course 22/09/2010 3. Nightduty Record 这是一张新笔记,我称之为笔记1。
现在我想解析本文中的具体信息。我感兴趣的是记录'所以记录后面的文本部分。以及该特定记录的日期,白色日期我指的是像02-11-2010这样的日期以及提前值班,延迟值班或夜间值班的概念(因此日期将是:' 02-09-2010 1。早期职责')。我遇到的问题是文件中没有真正的一致性,因此有时一个日期有2个注释,有时只有一个注释。有时候注释部分会包含文本,有时则不包含文本。
我知道如何解析Record部分,但我不知道如何首先解析日期然后解析注释部分。所以我想将问题分成两部分。我的第一步是将整个文件拆分为单独的日期部分。第二步:遍历所有日期部分以获取该特定日期部分的注释(使用正则表达式)。然后,我会创建一个列表,其中包含特定日期(如果我只想要特定日期,将它放在列单元格中,例如我只需解析该日期部分的前13个字符。)和注释(s)与该日期有关的。例如:
list = [02-08-2010 1.早期工作,[注1,注2],02-08-2010 2.迟到税,[注1]等]
让我们只关注日期解析,这样我的问题就很明确了。我使用以下代码:
date = r'Course\s+(.*?)(?:Course|$)'
date_list = re.findall(date, text, re.DOTALL)
for i in date_list:
print (i)
print ('XXX')
输出结果为:
22/09/2010 1.早期职责Josephine,Jansen 22-09-2010 10:37:08 Date22 / 09/2010责任1.早期任务1.3这里可能还有其他一些 相关内容Nursegoals Interventions Record现在是第四个 注意。 6.2.1.3混淆:观察。护士干预记录 这是一个新的,注意(再次),我称之为注释3. XXX 22/09/2010 3。 Nightduty Josephine,Jansen 22-09-2010 06:22:25 Date 22/09/2010 XXX 22/09/2010 3. Nightduty Record这是一个新笔记,我称之为笔记1。 XXX
此输出错过了以下元素:
['课程22/09/2010 1.早期工作记录这是一个说明,我打电话 它注意到2. Apple:0 /更少']
和
[' 3。 Nightduty 1.3 Nursegoals Interventions Record中的其他内容 6.2.1.3混淆:观察。护士干预']
所以它有点跳跃,因为我认为正则表达式考虑结束这个词' Course',als作为一个新的开头,所以说匹配。
如果有人可以帮助我真的很棒:)可能我错过了一些东西..
答案 0 :(得分:2)
将非捕获组更改为正向前瞻:
r'Course\s+(.*?)(?=Course|$)'
^^
请参阅regex demo。展开的,更快的变体是r'Course\s+([^C]*(?:C(?!ourse)[^C]*)*)'
(请参阅demo)。
否则,重叠的子字符串不匹配。
import re
rx = r"Course\s+(.*?)(?=Course|$)"
s = "Course 22/09/2010 1. Early duty Josephine, Jansen 22-09-2010 10:37:08 Date 22/09/2010 Duty 1. Early duty 1.3 Here there can be some other related stuff Nursegoals Interventions Record This is now the fourth note. 6.2.1.3 Confusion: Observing. Nursegoals Interventions Record This is a new, note (again), i call it note 3. Course 22/09/2010 1. Early duty Record This is again a note, i call it note 2. Apple: 0/less Course 22/09/2010 3. Nightduty Josephine, Jansen 22-09-2010 06:22:25 Date 22/09/2010 Course 3. Nightduty 1.3 Something else here Nursegoals Interventions Record 6.2.1.3 Confusion: Observing. Nursegoals Interventions Record Course 22/09/2010 3. Nightduty Record This is a new note, i call it note 1."
results = re.findall(rx, s, re.DOTALL)
for x in results:
print(x)
输出:
22/09/2010 1. Early duty Josephine, Jansen 22-09-2010 10:37:08 Date 22/09/2010 Duty 1. Early duty 1.3 Here there can be some other related stuff Nursegoals Interventions Record This is now the fourth note. 6.2.1.3 Confusion: Observing. Nursegoals Interventions Record This is a new, note (again), i call it note 3.
22/09/2010 1. Early duty Record This is again a note, i call it note 2. Apple: 0/less
22/09/2010 3. Nightduty Josephine, Jansen 22-09-2010 06:22:25 Date 22/09/2010
3. Nightduty 1.3 Something else here Nursegoals Interventions Record 6.2.1.3 Confusion: Observing. Nursegoals Interventions Record
22/09/2010 3. Nightduty Record This is a new note, i call it note 1.