用Python解析人类可读的日历

时间:2018-01-02 17:55:25

标签: python date parsing

铁路公司的每列火车仅在某些日期和某一天的某些日子之间在特定范围的车站之间行驶。

铁路公司已经发布了一份日历,每张火车都会显示该日历。此日历上的文本显然是由某些脚本通过计算机生成的,该脚本在数据库中显示日期。这种方式生成的句子一开始很难理解,但它们遵循一些严格的句法规则,因此使用正则表达式和一些字符串操作解析它们应该不难。当日期重叠或以反直觉方式指定时,事情变得复杂。

我需要编写一个脚本来解析这个日历,并为每列火车返回它所经过的一周的日期和日期。我们假设这个日历对当前年份(2018年)有效。以下是一些示例文本以及如何解析它们。

示例#1

原文:

  

从[原点]到[目的地]这列火车在非工作日内不会在2018-01-01至2018-06-30之间旅行。

含义(已解释):

这列火车总是在2018年旅行,但在07/01之前它只能在工作日旅行。

解析数据示例:

[{"from": "2018-01-01",
   "to": "2018-06-30",
   "days": (1, 1, 1, 1, 1, 1, 0)},  # (mon, tue, wed, thu, fri, sat, sun)
  {"from": "2018-07-01",
   "to": "2018-12-31",
   "days": (1, 1, 1, 1, 1, 1, 1)}]

实施例#2

原文:

  

从[原点]到[X],这列火车每天在2018-01-01和2018-12-31之间行驶。从[X]到[目的地],这列火车每天在2018-08-01和2018-08-04之间,每天2018-08-26和2018-12-31之间。它不会在2018年1月1日至2018年8月8日之间,2018-12-31,周日2018-08-26和2018-12-30之间旅行。

含义(已解释):

从[原点]到[X],火车总是在2018年行驶。从[X]到[目的地]火车的行驶方式如下:

  • 每天01/01至08/04,但周六
  • 从08/05到08/25永远不会
  • 每天从08/26到12/30,但周六和周日。
  • 于12月31日从未。

正如你所看到的那样,措辞非常严重,部分矛盾。

解析数据示例:

# From [origin] to [X]

[{"from": "2018-01-01",
   "to": "2018-12-31",
   "days": (1, 1, 1, 1, 1, 1, 1)}]


# For all the stations after [X]

[{"from": "2018-01-01",
   "to": "2018-08-04",
   "days": (1, 1, 1, 1, 1, 0, 1)},
  {"from": "2018-08-26",
   "to": "2018-12-30",
   "days": (1, 1, 1, 1, 1, 0, 0)}]

示例#3

原文:

  

从[原点]到[目的地]这列火车在2018-01-01和2018-11-30之间旅行,周一,周六,2018-12-25,2018-12-30和2018-12-每天31。它不会在2018-11-01之间的非工作日2018-12-30和2018-12-31之间旅行。

含义(已解释):

2018年的这列火车旅行如下:

  • 周一和周六01/01至10/31
  • 于11月1日从未
  • 周一和周六11/02至11/30
  • 从12月1日到12月24日从未
  • 每天12月25日
  • 从12月26日到12月29日从未
  • 每天12月30日至12月31日,但周日

解析数据示例:

[{"from": "2018-01-01",
  "to": "2018-10-31",
  "days": (1, 0, 0, 0, 0, 1, 0)},
 {"from": "2018-11-02",
  "to": "2018-11-30",
  "days": (1, 0, 0, 0, 0, 1, 0)},
 {"from": "2018-12-25",
  "to": "2018-12-25",
  "days": (1, 1, 1, 1, 1, 1, 1)},
 {"from": "2018-12-30",
  "to": "2018-12-31",
  "days": (1, 1, 1, 1, 1, 1, 0)}]

到目前为止我做了什么

我将问题分成多个部分:

  1. 从文本中提取数据。我将文本分成短语(以句点分隔)。然后我使用正则表达式和字符串操作来确定它是正数(“旅行”)还是负数(“不旅行”),获取日期间隔和星期几,单日期,一周中的单日。如果句子是否定的,我会撤销日期。

  2. 我将一周中的几天(以及“每天”,“工作日”之类的事情)转换为包含一周中几天的元组,正如我在示例中所写的那样。每个元组都与日期间隔相关联。

  3. 下一个问题是将所有日期间隔与一周中每一天的正确数据合并。可能有一个Python模块可以轻松地执行此操作,但我不知道从哪里开始(基于此步骤的完成方式,以前的步骤可能需要完全更改)。

  4. 另一个问题是每列火车的每个车站都应该有自己的日期。当日历从[原点]到[X] 和从[X]到[目的地] 表示时,[X]应以特定方式处理,如日期是第一个+第二个区间的日期的联合。

0 个答案:

没有答案