2009-09-10 17 views
18

我想在程序的輸出日誌上進行正則表達式匹配(使用Python)。該日誌包含一些看起來像這樣的行:我如何與具有未知組數的分組進行匹配

... 
VALUE 100 234 568 9233 119 
... 
VALUE 101 124 9223 4329 1559 
... 

我想捕獲以VALUE開頭的行首次出現後出現的數字列表。即,我希望它返回('100','234','568','9233','119')。問題是我不知道會有多少個數字。

我試圖用這個作爲一個正則表達式:

VALUE (?:(\d+)\s)+ 

此相匹配的行,但只抓住了最後的價值,所以我只是得到(「119」)。

+1

基於前面的問題,我發現這是不可能的正則表達式:http://stackoverflow.com/questions/464736/python-regular-expressions-how-to-capture-multiple-groups-from-a -wildcard-expre#464755 – 2009-09-10 20:14:26

回答

16

你在找什麼是解析器,而不是正則表達式匹配。在你的情況,我會考慮使用一個非常簡單的解析器,split()

s = "VALUE 100 234 568 9233 119" 
a = s.split() 
if a[0] == "VALUE": 
    print [int(x) for x in a[1:]] 

您可以使用正則表達式來看看你的輸入線是否符合您的要求的格式(使用你的問題正則表達式),那麼你就可以運行上面的代碼,而不必檢查"VALUE"並知道int(x)轉換將始終成功,因爲您已經確認以下字符組均爲全數字。

2

你可以只運行你的主要對手的正則表達式,然後運行在那些比賽的第二正則表達式來得到的數字:

matches = Regex.Match(log) 

foreach (Match match in matches) 
{ 
    submatches = Regex2.Match(match) 
} 

這當然也是,如果你不想寫一個完整的解析器。

+2

這是哪種編程語言? – 2017-05-10 12:59:49

9
>>> import re 
>>> reg = re.compile('\d+') 
>>> reg.findall('VALUE 100 234 568 9233 119') 
['100', '234', '568', '9223', '119'] 

這不會驗證關鍵字「VALUE」出現在字符串的開頭,它不驗證,有項目之間只有一個空格,但如果你能做到這一點作爲一個單獨的步驟(或者如果您根本不需要這樣做),那麼它會查找任何字符串中的所有數字序列。

2

另一個沒有在這裏描述的選項是有一堆可選的捕獲組。

VALUE *(\d+)? *(\d+)? *(\d+)? *(\d+)? *(\d+)? *$ 

這個正則表達式捕獲由空格分隔的5位數字組。如果您需要更多潛在羣組,請複製並粘貼更多*(\d+)?區塊。

0

我有同樣的問題,我的解決方案是使用兩個正則表達式:第一個匹配我感興趣的整個組,第二個解析子組。例如,在這種情況下,我會與此啓動:

VALUE((\s\d+)+) 

這應導致三個匹配:[0]的整個線,[1]後的值[2]的最後一個空間+值的東西。

[0]和[2]可以忽略不計,然後按[1]可與以下一起使用:

\s(\d+) 

注:這些正則表達式都沒有測試,我希望你的想法雖然。


之所以Greg's answer不爲我工作是由於解析的第二部分是比較複雜,不是簡單的一些數字用空格隔開。

但是,我會誠實地與格雷格的解決方案,這個問題(這可能是更有效的方式)。

我只是寫這個答案,以防有人正在尋找像我需要的更復雜的解決方案。

相關問題