2017-08-05 85 views
0

我工作的一大批量文本字符串,試圖匹配日期時間和使用strptime()函數將其轉換爲MM-DD-YYYY格式。Python的正則表達式「負面」模式匹配

然而,也有一些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

請問你的findall擺在首位的工作?請發佈完整的正則表達式。 –

+0

我會將其添加到原始問題線程。 –

+0

如果你能用簡單的英語解釋你需要匹配的是什麼,我會更樂意幫助你。日期時間可以用很多格式編寫,所以不知道你在用什麼工作很難。 – kpie

回答

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 
+0

這工作完美!非常感謝。你介意我問在這種情況下\ b()\ b是如何(以及爲什麼)工作的? –

+0

'\ B'用的字母數字字符和非字母數字字符的序列之間的匹配斷裂(不匹配的字符,就在實際上存在序列中的中斷)。所以當你匹配的第一個字符應該是一個數字時,第一個'\ b'要求在匹配的字符之前沒有數字(或字母或下劃線)。類似的事情發生在最後。 – trincot