我想使用python(虽然任何语言都可以),查看结构化文本文件,如下所示:
========= Weekend of 2016-12-02: ================
Schedule1:
bob@email
Schedule2:
john@email
bob@email
Schedule3:
Terry@email
========= Weekend of 2016-12-09: ================
Schedule1:
jake@email
Schedule2:
mike@email
bob@email
Schedule3:
howard@email
这种模式在今年余下的时间里重复,我想要完成的是找到任何重叠的时间表。因此,如果bob @ email在那个周末有不止一个时间表,我想找到并打印出来。 例如:
Overlaps found for:
========= Weekend of 2016-12-02: ================
bob@email is scheduled for schedule1, and schedule2.
由于这是唯一的重叠,因此这是唯一可以打印的事件,如果有更多,那么它们将以相同的格式打印在彼此之下。 有没有办法实现这个目标?
到目前为止我找到的代码允许我找到每个周末并打印出来,但是我不确定如何更详细地查看内容。
import re
def compare():
with open("weekends.txt","r") as fp:
for result in re.findall('Weekend of (.*?):', fp.read(), re.S):
print(result)
这会产生
2016-12-02
2016-12-09
谢谢,如果有任何问题,请告诉我。
答案 0 :(得分:1)
您可以使用正则表达式创建集合的字典来执行此类操作:
import re
from collections import Counter
data={}
with open(fn) as f_in:
txt=f_in.read()
for block in re.finditer(r'^=+\s+([^:]+:)\s=+\s+([^=]+)', txt, re.M):
di={}
for sc in re.finditer(r'^(Schedule\s*\d+):\s*([\s\S]+?)(?=(?:^Schedule\s*\d+)|\Z)', block.group(2), re.M):
di[sc.group(1)]=set(sc.group(2).splitlines())
data[block.group(1)]=di
for date, DofS in data.items():
c=Counter()
for s in DofS.values():
c+=Counter(s)
inverted={k:[] for k, v in c.items() if v>1}
if not inverted:
continue
print date
for k in DofS:
for e in DofS[k]:
if e in inverted:
inverted[e].append(k)
print "\t",inverted
打印:
Weekend of 2016-12-02:
{'bob@email': ['Schedule1', 'Schedule2']}
答案 1 :(得分:0)
我认为您可以在每个周末使用地图存储<name, list of schedule>
,例如<bob@email, [Schedule1]>
。每次,您想要添加新项目,您可以检查是否已经设置了密钥。如果是,请将该计划添加到该对应列表。如果不是,请向该地图添加新项目。然后,当您打印出来时,只打印列表中包含多个计划的项目。
对于Python,您可以使用字典作为地图。 https://www.tutorialspoint.com/python/python_dictionary.htm