2015-06-16 88 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会忽略它。 –

相关问题