Python正则表达式查找所有日期

时间:2014-11-18 21:44:37

标签: python regex

我希望在某些日历数据中找到30, 12/1, 2, 3等等,我是从html解析而不是2014‍‍09:30

到目前为止,我已经尝试了

[\d]{1,2}[/]?[\d]{1,2}[^:]

和许多不同的变化,但似乎没有什么适合。 有没有办法用一个正则表达式找到所需的日期,或者要求0 - 31或字符串包含数字和/之间的数字更有意义? 谢谢你的帮助:)

修改

我解析的数据如下所示:

30
Name, Ofsomeone
Name, Ofsomeone
Name, Ofsomeone
weg.ics
GMT+01:00Amsterdam,Berlin,Bern,Rome,Stockholm,Vienna
weg:December2014
Day
WorkWeek
Week
Month
Today
December2014
December2014
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday
12/1
Name, Ofsomeone
Name, Ofsomeone
Name, Ofsomeone
2
Name, Ofsomeone
Name, Ofsomeone
3
Name, Ofsomeone
Name, Ofsomeone

2 个答案:

答案 0 :(得分:2)

听起来你想要的规则是:1到31之间的数字,单独作为一个单词(不是日期,时间,4位数字等的一部分),或者是m / d格式的日期

我们假设您愿意接受任何1位或2位数字,而不是试图拒绝7538/22/30正则表达式本身。

  • 您已经获得了[\d]{1,2}部分 - 尽管那里的括号确实不需要。
  • 我们可以把它写成两个单独模式之间的交替,但用可选的/和数字来编写它会更有趣,所以让我们这样做。
  • 要使其成为可选项,我们需要将?修饰符附加到其中,这意味着一个组。并且大概你不想分开捕捉这一天,所以它是一个非捕获组。
  • 要自行处理"",因为这似乎实际上意味着一条线,我们可以使用多线模式和^$模式。

所以:

^\d{1,2}(?:/\d{1,2})?$

Regular expression visualization

Debuggex Demo

如果 希望将1-31写入正则表达式,您可能希望将其更改为可选的1-12和斜杠,然后是1-31,这将是一个大混乱(^(?:(?:\d|(?:1[0-2]))/)?(?:(?:[12]?\d)|(?:3[01]))$);如果你想根据第一个价值处理30和29 ......那就试试吧。


这是对最初陈述的不同问题的原始答案。

听起来你想要的规则是:两个(1或2位数)数字用连字符或带有可选空格的斜杠分隔。

所以,只需将其转换为语法:

  • 您已经获得了[\d]{1,2}部分 - 尽管那里的括号确实不需要。
  • 您希望匹配连字符或斜杠,而不是斜线或无匹配,因此请将[/]?更改为[-/]
  • 您希望在连字符或斜杠周围留出空格,因此在其两侧添加\s*
  • 我不知道您为什么要尝试排除后面的冒号,因为09:30已经不符合该模式。

所以:

\d{1,2}\s*[-/]\s*\d{1,2}

Regular expression visualization

Debuggex Demo

请注意,它匹配1 - 3110/2711/112/1的所有内容,且与201409:30不匹配。< / p>

答案 1 :(得分:0)

这可能适合你:

[\d]{1,2} ?([^:][\/]|-) ?[\d]{1,2}

Regular expression visualization

Debuggex Demo

注意:我们需要在[\d]{1,2}之间的标记,在第一个之后的空格和第二个之间的空格可以是可选的,我们使用空间之后的?进行操作并且在模式的中心不可能是: ([^:]),可以是/ ([\/])或(|-