2015-06-16 83 views
2

我正在解析iptables的日誌文件尋找源IP。爲此,我使用了兩個re.findall實例,一個用於查找「SRC = x.x.x.x」,另一個用於實際獲取IP。有沒有比解析字符串更好的方法?

for line in iptables: 
    src = re.findall('SRC=\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}', line) 
    ip = re.findall('\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}', src) 

有沒有更好的方法來實現相同的結果?那就是獲得SRC IP。

對於我現在要做的事情來說真的沒有關係,但我想知道是否有更好的方法來實現未來的發展。

+5

你不能在IP周圍放一個「(...)」嗎? –

+0

@tobias_k我不明白你的意思。我寫的和'(\ d {1,3} \。\ d {1,3} \。\ d {1,3} \。\ d {1,3})'有什麼區別? – yzT

+0

圓括號捕獲值,如果找到它可以稍後使用。 – Bonsaigin

回答

3

您應該將IP部分放入一個組中,即括號內。這樣,您可以在search的比賽中獲得group的比賽。

>>> line = "SRC=127.0.0.1" 
>>> m = re.search(r'SRC=(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})', line) 
>>> m.group(0) 
'SRC=127.0.0.1' 
>>> m.group(1) 
'127.0.0.1' 

這裏,group(0)是整個比賽,group(1)括在所述第一組的()的一部分,等等。

+0

沒問題,7分鐘後答案被接受。還有一個問題,'r'用於什麼? – yzT

+0

嗯,順便說一句,我注意到我不需要使用'm.group(0)'和'm.group(1)',只是打印顯示IP的'm'。 – yzT

+0

'r'使得Python不會將字符串中的反斜槓解釋爲轉義字符。在這裏你並不需要它,因爲\ d不會是一個有效的轉義序列,所以Python會忽略它。 –

相關問題