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

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

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

示例#1

Original text:

从[原点]到[目的地]这列火车在非工作日的2018-01-01到2018-06-30之间不行驶 .

Meaning (explained):

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

Example parsed data:

[{"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

Original text:

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

Meaning (explained):

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

  • 每天01/01至08/04,但周六

  • 从08/05到08/25永远不会

  • 每天从08/26到12/30,但周六和周日 .
    永远不会在12月31日

  • .

正如你所看到的,这个措辞非常严厉,而且部分矛盾 .

Example parsed data:

# 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

Original text:

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

Meaning (explained):

这列火车在2018年的行程如下:

  • 周一和周六01/01至10/31
    永远不会在11月1日

周一和周六11月11日至11月30日

  • 从12月1日到12月24日从未
    每天12月25日

  • 从12/26到12/29永远不会

  • 每天12月30日至12月31日,但周日

Example parsed data:

[{"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)}]

到目前为止我做了什么

我将问题分成多个部分:

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

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

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

  • 另一个问题是每列火车的每个车站都应该有自己的日期 . 当日历从[原点]到[X]以及从[X]到[目的地]时,应该以特定方式处理[X],因为它的日期是第一个第二个间隔的日期的并集 .