2011-06-29 59 views
5

我有一個看起來像這些字符串:Python的正則表達式來提取日期

{server}_{date:YYYYMMDD}{int:######} 
{server}_{date:MON DAY YYYY}{int:######} 

...加上更多的,在不同的日期格式。此外,可以有任意數量的{}塊,並且它們可以按任何順序出現。

我想在Python 3.2中的花括號之間得到「日期」部分。因此,對於第一個字符串,我只想得到「{date:YYYYMMDD}」,對於第二個字符串,我只需要「{date:MON DAY YYYY}」。 「日期」塊中唯一需要的字符是字母和空格。

我的正則表達式是:

\{date:(\w|\s)*\} 

我在this Regex builder測試了這一點,但預期它不匹配。這是我在Python上的輸出:

>>> import re 
>>> re.findall('\{date:(\w|\s)*\}', '{server}_{date:YYYYMMDD}{date:MONDAYYYYY}{int:######}') 
['D', 'Y'] 
>>> re.findall('\{date:(\w|\s)*\}', '{server}_{date:MON DAY YYYY}{int:######}') 
['Y'] 

有人能指出我的模式有什麼問題嗎?

+0

感謝您的所有答案!現在看看每個人的答案,很明顯我忽略了我的問題中的重要細節。我編輯了我的帖子並添加了更多的細節。 – tgxiii

回答

5

'(\{date:[\w\s]+\})'給你想要的東西:

>>> import re 
>>> re.findall('(\{date:[\w\s]+\})', '{server}_{date:YYYYMMDD}{date:MONDAYYYYY}{int:######}') 
['{date:YYYYMMDD}', '{date:MONDAYYYYY}'] 
>>> re.findall('(\{date:[\w\s]+\})', '{server}_{date:MON DAY YYYY}{int:######}') 
['{date:MON DAY YYYY}'] 

如果你想唯一的數據值,使用'\{date:([\w\s]+)\}'

1

試試這個

str = '{server}_{date:MON DAY YYYY}{int:######}' 
re.findall('\{date:.*\}(?=\{)',str) 

它返回

['{date:MON DAY YYYY}'] 

str = '{server}_{date:YYYYMMDD}{int:######}' 
re.findall('\{date:.*\}(?=\{)',str) 

返回如下:

[ '{日期:YYYYMMDD}']

(?=..\{)執行以下操作:

(?= ...) 相配如果...下一個相匹配,但沒有按不會消耗任何字符串。這被稱爲前瞻斷言。例如,如果Isaac(?= Asimov)跟隨着'Asimov',它將匹配'Isaac'。 (source)

注:這隻會如果另一個塊{..} {下}日期,我想這是必要的,如果缺少你輸入可能是無效的功能。

+0

我應該提到,可以有任意數量的{}塊,並且它們可以以任何順序出現。我的不好,我的問題不夠詳細。雖然我很欣賞答案。 – tgxiii

+0

好吧,只要另一個塊跟在它後面,它仍然會找到以「{date:。*]」開頭的塊。 – matchew

0
'{server}_({date:.+?}){int:' 

足夠

,或者可能會更好

'(?<={server}_)({date:.+?})(?={int:)' 
2
>>> re.findall('\{date:([\w\s]*)\}', '{server}_{date:YYYYMMDD}{date:MONDAYYYYY}{int:######}') 
['YYYYMMDD', 'MONDAYYYYY'] 
0

使用捕獲組圍繞整個正則表達式,併爲(\w|\s)部分非捕獲組:

(\{date:(?:\w|\s)*\})

這會導致你想要的輸出:

>>> re.findall('(\{date:(?:\w|\s)*\})', '{server}_{date:MON DAY YYYY}{int:######}') 
['{date:MON DAY YYYY}'] 
>>> re.findall('(\{date:(?:\w|\s)*\})', '{server}_{date:YYYYMMDD}{date:MONDAYYYYY}{int:######}') 
['{date:YYYYMMDD}', '{date:MONDAYYYYY}'] 
+0

如果您使用非捕獲組,實際上並不需要在整個正則表達式中放置括號。 ''\ {date:(?:\ w | \ s)* \}''產生相同的結果。 – senderle