使用Python在TXT文件中查找重复名称



我想使用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@电子邮件在该周末的一个时间表以上,我想找到并打印。示例:

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

谢谢,请告诉我是否有任何问题。

您可以使用正则表达式创建sets的操作:

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'^(Schedules*d+):s*([sS]+?)(?=(?:^Schedules*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']}

我认为您可以使用地图存储<name, list of schedule>,例如<bob@email, [Schedule1]>,当您度过每个周末时。每次,您都想添加一个新项目,都可以检查是否已经设置了密钥。如果是,则将该时间表添加到相应的列表中。如果没有,请在该地图中添加新项目。然后,当您打印出来时,仅在列表中打印超过1个时间表的项目。

对于Python,您可以将字典用作地图。https://www.tutorialspoint.com/python/python_dictionary.htm

相关内容

  • 没有找到相关文章

最新更新