排除基于单个字符差异的字符串匹配

时间:2014-08-22 21:24:13

标签: regex python-2.7 regex-lookarounds

我有多个字符串。以下是三个代表性的例子:

1. Fridays, Saturdays, 7:30 a.m.-12:45 p.m.
2. Mondays, Wednesdays, Fridays, 9:30 a.m.
3. Mondays, Thursdays-Saturdays, 7:30-10:30 p.m.

我想要做的是创建一个与前两个字符串匹配的正则表达式(包括的时间,我已经写过),但不是第三个。唯一的主要区别是第三个字符串包含一个日期范围(Thursdays-Saturdays) - 即它包含一个连字符b / w天数。

我尝试过但未能使用外观完成此操作 - 我相信based on what I've read看起来是正确的工具(至少对于python)。这就是我所拥有的(live demo here) - 但它匹配所有内容而不仅仅是前两个字符串:

[MTWFS]\w.*days,\s1?\d(?::\d\d)?(?:\s[ap]\.m\.)?(?:-1?\d(?::\d\d)?(?:\s[ap]\.m\.))?

我真的尝试过我能想到的每一个可想到的迭代。我根本无法弄清楚如何匹配" Days,Days,[重复" Days,"无论多少次,时间"范式 - 我认为这很简单,因为我对正则表达式很新,而且看起来很基本。谢谢你的帮助!

3 个答案:

答案 0 :(得分:2)

由于您要排除包含日期范围的字符串(例如Thursdays-Saturdays)并且不担心捕获每个字符串的某些部分,您可以使用否定前瞻来执行此操作。

^(?!.*(?:Mon|Tues|Wednes|Thurs|Fri|Satur|Sun)days-).+$

Working Demo

答案 1 :(得分:1)

以下正则表达式:

^(?:(?:Mon|Tues|Wednes|Thurs|Fri|Satur|Sun)days,\s*)+\d{1,2}:\d\d [ap]\.m\.(?:-\d{1,2}:\d\d [ap]\.m\.)?$

它匹配一系列日期名称,后跟逗号和可选空格,然后是一次或两次用-分隔。

DEMO

答案 2 :(得分:1)

对于工作日部分,我会写出所需的日子,所以有趣的价值观(如Suburbandays)不会偷偷溜进去:

^(?:(?:(?:Mon|Tues|Wednes|Thurs|Fri|Satur|Sun)days,\s*)+)

我还会尝试验证时间(因此13:00 a.m.被拒绝):

 ((?:-?(?:[1-9]:|1[012]:)(?:[0-5]\d)\s*[ap]\.m\.){1,2})

Original regex101 demo以及updated regex101 demo(带内联评论)。