2017-06-26 52 views
0

我查看了一些舊的Java代碼,其中我從一些字符串中提取了日期和它們的格式。這是一個可怕的混亂,如果條件和正則表達式模式和匹配。 所以我想了解如何在Python和Python中解決這個問題。我有一些映射到日期格式的正則表達式模式,從中創建一個時間戳。聽說「如果在Java中的switch語句,在Python應該有一個dictonary」:使用註釋將RegEx映射到附加「指令」

pattern_dic = { 
    "[\\d]{2}:[\\d]{2}, .{3} [\\d]{1,2}, [\\d]{4} \\(UTC\\)": "HH:mm, MMM dd, yyyy (zzz)", 
    "[\d]{2}:[\d]{2}, [\d]{1,2} .{3} [\d]{4} \(UTC\)"  : "HH:mm, dd MMM yyyy (zzz)", 
    ... 
} 

*我認爲,我必須要改變這些日期模式,因爲我剛剛從Java解決方案複製它們。

在另一個我有正則表達式/替換對的問題中,我找到了一個很好的解決方案,使用這個字典,就像這個 (禮貌地向Stack Overflow上的一些聰明人)。這隻有在匹配正則表達式是一個簡單字符串時纔有效,所以它可以在字典中查找(我認爲)。

pattern_acc = re.compile(r'\b(' + '|'.join(pattern_dic.keys()) + r')\b') 
comment = pattern_acc.sub(lambda x: pattern_dic[x.group()], comment) 

這是我到目前爲止所提出的。我的問題是,我不知道我能得到的正則表達式匹配的部分來查找在我的字典(「matching_date_pattern」):

def multi_match(input_string, pattern_dic): 
    date_pattern = re.compile(r'\b(' + '|'.join(pattern_dic.keys()) + r')\b') 
    matches = date_pattern.findall(input_string) 

    date_formats = [] 
    for match in matches: 
     matching_string = match.group() 
     date_format = pattern_dic["matching_date_pattern"] 
     date_formats.append((matching_string, date_format)) 

編輯: 我應該說,我會就像解決這個問題一樣。我想分開匹配和搜索。雖然能夠訪問匹配模式。 例如,如果正則表達式由許多組組成,並且它們匹配的「指令」會變得更加複雜。想象一下,例如,你期望很多不同的文本對象,比如鏈接,降價元素等等。我現在的問題歸結爲匹配和搜索之間匹配的模式。

也許這個問題也是編譯模式的代價,因爲單獨編譯它們當然會更容易訪問它們。

+0

只要遍歷模式並在找到匹配項後獲取所需值,我就會更容易。 –

回答

0

你從堆棧溢出搶走這個代碼是好是要匹配多個正則表達式中的任意,但不解決您找到您的正則表達式在每一個特定的情況下匹配的其中的問題。你還是隻是遍歷pattern_dic並依次檢查每個鍵:

def multi_match(input_string, pattern_dic): 
    for regexp in pattern_dic: 
     re.search(regexp, input_string) 
     matching_string = match.group() 
     date_format = pattern_dic[regexp] 
     date_formats.append((matching_string, date_format)) 
    return date_formats 

邊備註:.append有一個參數,因此,有必要形成一個元組 - 從而對額外的括號。

+0

謝謝你的迴應。我編輯了這個問題並編輯了一些推理,爲什麼我想要進行匹配和搜索。 –

+0

但是你仍然可能是對的,因爲我可以單獨編譯模式。 –

+0

如果正則表達式的數量不是非常高,那麼您並不需要顯式編譯它們,就像Python爲您做的那樣並緩存結果一樣。但是,如果你有很多這樣的內存(如果我沒有記錯的話,那麼大部分內存都大於512),那麼你會超過Python的緩存,所以自己編譯它們是個好主意。 –

相關問題