2014-08-27 100 views
0

我正在使用熊貓數據框,並希望從描述中的日期創建系列,開始日期和結束日期。我正在使用正則表達式來查找日期的發生,但似乎無法找到如何在第一個日期停止,然後繼續找到第二個日期。Python正則表達式匹配第一次約會,然後第二次

尋找這裏:How to stop at first occurence of match?

得到一個答案

(?s)(\d{1,2}/\d{1,2}/\d{2,4}).* 

但這並沒有爲我工作,我還是被捕獲的所有日期,而不是隻有第一個。

使用

(\d{1,2}/\d{1,2}/\d{2,4})? 

也不能工作。

基本上我想獲得在

pattern_generic=re.compile('(\d{1,2}\/\d{1,2}\/\d{2,4})') #perhaps will do start and end) 
report['Start Date'] = report['Description'].apply(lambda x: re.findall(pattern_start,x)) 
report['End Date'] = report['Description'].apply(lambda x: re.findall(pattern_end,x)) 

不知道這是接近找到第一和第二個日期,並把它們放入列的最佳途徑。任何幫助/建議表示讚賞!

編輯:

實施例闡明:我有標題爲「描述」與各種項目的列的數據幀,例如「從1/2/13-3 /十五分之四購買的訂閱」。我想這兩個日期拍攝成兩列,開始和結束

Description          Start Date  End Date 
'Purchased Subscription from 1/2/13-3/4/15'  1/2/13  3/4/15 
+0

一個例子會更好。 – 2014-08-27 15:11:46

+0

當然,我添加了一個我正在工作的樣本以及我想實現的目標,讓我知道如果這樣做會清除一些東西 – Alexis 2014-08-27 15:16:07

+0

,所以有很多行像''從1/2/13-3/4/15''在你的輸入中,我是否正確? – 2014-08-27 15:17:30

回答

0

你可以使用下面的正則表達式,

(?s)(\d{1,2}/\d{1,2}/\d{2,4})-(\d{1,2}/\d{1,2}/\d{2,4}).* 

DEMO

分配組索引1裏面的人物來Start Date和組索引2至End Date

>>> s = """'Purchased Subscription from 1/2/13-3/4/15'  1/2/13  3/4/15 
foo 1/2/13-3/4/15'  5/2/13  6/4/15 
1/2/13-3/4/15'  7/2/13  8/4/15 
1/2/13-3/4/15'  9/2/13  10/4/15""" 
>>> m = re.search(r'(?s)(\d{1,2}\/\d{1,2}\/\d{2,4})-(\d{1,2}\/\d{1,2}\/\d{2,4}).*', s) 
>>> m.group(1) 
'1/2/13' 
>>> m.group(2) 
'3/4/15' 
>>> m = re.findall(r'(\d{1,2}\/\d{1,2}\/\d{2,4})-(\d{1,2}\/\d{1,2}\/\d{2,4}).*', s, re.DOTALL) 
>>> m 
[('1/2/13', '3/4/15')] 
+0

嘿!我嘗試了這個,但繼續得到一個錯誤,NoneType對象有組,所以它似乎沒有發現任何東西... – Alexis 2014-08-27 15:53:46

+0

使用findall函數,'m = re.findall(r'(\ d {1,2} \ /\d{1,2}\/\d{2,4})-(\d{1,2}\/\d{1,2}\/\d{2,4}).*」, s,re.DOTALL)' – 2014-08-27 15:56:10

2

我會使用這樣的:

(?s)\b(\d{1,2}/\d{1,2}/\d{2,4})\b-\b(\d{1,2}/\d{1,2}/\d{2,4})\b 

的開始日期將是在第1組和第2組

0

這裏是我以前完全解決我的問題代碼:

data['End Date'] = '' 
data['Start Date']='' 

pattern=re.compile('(?s)(\d{1,2}\/\d{1,2}\/\d{2,4}).*?(\d{1,2}\/\d{1,2}\/\d{2,4}).*') 

first_list = [] 
second_list = [] 
for x in data['Product Description']: 
    m = re.search(pattern,x) 
if m is None: 
     first_list.append('') 
     second_list.append('') 
else: 
    first_list.append(m.group(1)) 
    second_list.append(m.group(2)) 


data['Start Date'] = Series(first_list) 
data['End Date'] = Series(second_list) 
相關問題