Python正则表达式“否定”模式匹配

时间:2017-08-05 16:08:00

标签: python regex datetime findall

我正在处理大量文本字符串,尝试匹配日期时间并使用strptime()函数将它们转换为MM-DD-YYYY格式。

但是,文本中出现了一些5位数的序列号(例如,90481)误导我的.findall()函数将它们视为日期时间。如何通过包含^()类型的条件来排除它们来避免它们?

它们的共同之处在于它们都是5位数,所以我尝试了^(?!\ d {5}),但结果并不好。解决这组数字的最佳方法是什么?

谢谢。

注1:我已阅读this post,但似乎无法理解。

注2:关于某人在评论部分提出的日期格式

我正在处理的数据框中有许多日期格式,例如:

05/10/2001; 05/10/01; 5/10/09; 6/2/01
May-10-2001; May 10, 2010; March 25, 2001; Mar. 25, 2001; Mar 25 2001;
25 Mar 2001; 25 March 2001; 25 Mar. 2001; 25 March, 2001
Mar 25th, 2001; Mar 25th, 2001; Mar 12nd, 2001
Feb 2001; Sep 2001; Oct 2001
5/2001; 11/2001
2001; 2015

所以我有一个相当长的.findall(r'')函数,但重点是避免选择那些5位序列号。

此致

1 个答案:

答案 0 :(得分:1)

您可以在正则表达式中使用\b,以避免在数字中间找到匹配数字。将一个放在开头,一个放在最后,并通过将其余部分包装在非捕获组中,确保它们不包含在|(OR)操作的范围内。

我删除了几个月以保持简短:

\b(?:\d{1,2}\/\d{1,2}\/\d{2,4}|(?:Jan|Feb|Mar|Apr|   |Nov|Dec)[a-z]*-\d{2}-\d{2,4})\b