2015-12-29 147 views
0

我日誌結構看起來像正則表達式如何匹配空

a b c| 

因此,例如:

Mozilla 5.0 white| 

亦宜/解壓縮到某事像

a: Mozilla, b: 5.0, c: white 

但我的日誌中有一個條目是:

iOS |

可以作爲

a:iOS, b:null, c:null 

我使用python3重,做配以命名組解釋2 P

有沒有什麼辦法來實現這一目標?

+0

「應該像[..]一樣匹配......「?!我完全困惑。你能用輸入和預期的匹配/匹配組做出一個或兩個具體的例子嗎? – timgeb

+0

...和正在使用的正則表達式... – barny

回答

2
>>> m = re.match(r"(?P<a>[^\s]+)(\s+(?P<b>[^\s]+))?(\s+(?P<c>[^\s]+))?\s*\|") 

>>> m.groups() 
('iOS', None, None) 
>>> m.groupdict() 
{'c': None, 'a': 'iOS', 'b': None} 

>>> m = re.match(r"(?P<a>[^\s]+)(\s+(?P<b>[^\s]+))?(\s+(?P<c>[^\s]+))?\s*\|") 

>>> m.groups() 
('Mozilla', ' 5.0', ' white') 
>>> m.groupdict() 
{'c': 'white', 'a': 'Mozilla', 'b': '5.0'} 

UPDATE:

我注意到以前的版本包含在返回的羣體空間 - 我的因素\ S +入(P <> ...?),以節省一對夫婦字節,但它有這種副作用。所以我解決了這個問題,並在最後的'|'之前讓它容忍空間。

2

你可以把你的模式列表中的類似以下內容:

>>> pattern = ['a', 'b', 'c'] 

然後使用re.findall()找到所有相關的部分,然後用zipdict以創建相對詞典:

>>> s = "IOS|" 
>>> dict(zip(pattern,re.findall('([^\s]+)?\s?([^\s]+)?\s?([^\s]+)?\|',s)[0])) 
{'a': 'IOS', 'c': '', 'b': ''} 
>>> 
>>> s = "Mozilla 5.0 white|" 
>>> 
>>> dict(zip(pattern,re.findall('([^\s]+)?\s?([^\s]+)?\s?([^\s]+)?\|',s)[0])) 
{'a': 'Mozilla', 'c': 'white', 'b': '5.0'}