2011-06-29 57 views
-2

我是python中的新學習者。我需要將以下字符串作爲數組。python中的數組作爲字符串

['Soyuz_TMA-16', '2009-09-30'] 
['Soyuz_TMA-17', '2009-12-20'] 
['Soyuz_TMA-01M', '2010-10-07'] 
....... 
....... 
........ 

,這樣我可以在字符串如[ 'Soyuz_TMA-16',2009-09-30' ]的文本文件搜索如果匹配的話一起在一些線路如:。

abcd 30th september 2009 skakk gkdka kkhhf Soyuz TMA 16. 
    gfigka Soyuz TMA 16 hfkhf hghhg fghh 30th september 2009. 

那麼它應該返回整行標記匹配字符串。

希望在這裏得到一個解決方案。謝謝!

+1

您嘗試過什麼嗎?如果沒有日期分析/強制,2009-09-30將與2009年9月30日相匹配,如果還有其他可能的格式,它會變得雜亂和緩慢。 –

+3

歡迎來到Stack Overflow!你會發現,如果你試圖解決問題,其他人更能夠理解你的問題,並且更願意幫助你找到答案。 –

+0

你可能應該刪除_array_標籤 - 你大概要麼是_dict_,要麼_sequence_,而不是_array_。 (_array_表示來自NumPy的數字類型數組。請參見[關於標準類型的文檔](http://docs.python.org/library/stdtypes.html)) – smci

回答

3

解析任務和日期的列表轉換成字典任務,它的鍵是日期的字符串值:「2009-12-20」。 然後,你可以查找字典('如果在任務日期:...')。 你還需要能夠解析文本形式的日期(使用正則表達式)到'2009-12-20'窗體中,我寫了一個函數'dtuple_to_date()'。 (你可以使用一套而不是一個字典,相同的想法。查找映射類型像字典或集是恆定的時間,即O(1),而不是O(N)的N個元素列表)

此代碼的工作原理:

import re 

missions = """['Soyuz_TMA-16', '2009-09-30'] 
    ['Soyuz_TMA-17', '2009-12-20'] 
    ['Soyuz_TMA-01M', '2010-10-07']""".translate(None,',[]\'\"').split('\n') 
missions = [t.split() for t in missions] 

missions = dict((d,m) for m,d in missions) 


input = """abcd 30th september 2009 skakk gkdka kkhhf Soyuz TMA 16. 
gfigka Soyuz TMA 16 hfkhf hghhg fghh 30th september 2009.""".split('\n') 


find_dates = re.compile(r'(\d+)\S*\s+(\S+)\s+(2008|2009|2010|2011)') 

def dtuple_to_date(d,mth,y): 
    """convert ('30','september','2009') to '2009-09-30""" 
    m = {'january':1,'february':2,'march':3,'april':4,'may':5,'june':6, 
     'july':7,'august':8,'september':9,'october':10,'november':11, 
     'december':12}[mth.lower()] 
    return "%s-%02d-%s" % (y,m,d) 


for idx,line in enumerate(input): 
    for (day,mth,yr) in find_dates.findall(line): 
     date = dtuple_to_date(day,mth,yr) 
     #print 'Looking up', date 
     if date in missions: 
      print 'Line %d: reference to mission %s on date %s' \ 
       % (idx, missions[date], date)