2016-08-29 172 views
-1

我試圖解析看起來像下面的輸出。解釋正則表達式

1 192.168.1.1   0.706 ms 0.654 ms 0.697 ms 
2 10.10.10.10   4.215 ms 4.199 ms 4.175 ms 
3 123.123.123.123  4.000 ms * * 

我有正常的表達式工作,如下所示。

此正則表達式的工作原理:

re.compile(r'^\s*(\d+)\s+?([\s\S]+?(?=^\s*\d+\s+))', re.M) 

這將正確採集的每一行。

('1', ' 192.168.7.1   0.706 ms 0.654 ms 0.697 ms\n') 
('2', ' 10.10.10.10   4.215 ms 4.199 ms 4.175 ms\n') 
('3', ' 123.123.123.123  4.000 ms * *\n') 

我的問題是大膽的是否在(?=^\ s * \ d + \ s +)之前

即將正則表達式更改爲如下所示。

這個正則表達式不起作用。唯一的區別是?標記已刪除。

re.compile(r'^\s*(\d+)\s+?([\s\S]+(?=^\s*\d+\s+))', re.M) 

我試過這個,它不起作用。它不會分別解析每條線。

任何人都可以幫我解釋這個正則表達式嗎?

回答

2

按照re docs

*?+???

'\*''+',和'?'限定符都是貪婪;它們匹配儘可能多的文本。有時候這種行爲是不希望的;如果RE <.*><a> b <c>匹配,則它將匹配整個字符串,而不僅僅是<a>。在限定符後添加?使其在中執行匹配非貪婪或最小時尚;儘可能少的字符將被匹配。使用RE <.*?>將只匹配<a>

所以你的情況,[\s\S]+?將匹配一個空格或無空格字符最小,而[\s\S]+將貪婪的儘可能多的字符,因爲它可以匹配。

+0

非常感謝! – sh0731

-1

該問號本身沒有意義 - 特定序列(?=開始「肯定超前斷言」,它基本上要求正則表達式中的內容必須存在於正在搜索的字符串中,但不算作正則表達式匹配的一部分。

有幾個先進的正則表達式功能,以(?開頭 - 詳細信息請參閱re模塊的文檔。這個特定的序列用於這樣的擴展,因爲它在正則表達式中是沒有意義的 - 開放的paren必須跟隨某個東西,並且問號必須在某個前面。