我下面有一个文本文件,如果行的最后一部分是数字,则尝试提取字符串
4:16:09PM - xx yy DOS activity from 10.0.0.45
9:43:44PM - xx yy 1A disconnected from server
2:40:28AM - xx yy 1A connected
1:21:52AM - xx yy DOS activity from 192.168.123.4
我的代码
with open(r'C:\Users\Desktop\test.log') as f:
for line in f:
dos= re.findall(r'\d',line.split()[-1])
print (list(dos))
我的出场
['1', '0', '0', '0', '4', '5']
[]
[]
['1', '9', '2', '1', '6', '8', '1', '2', '3', '4']
预期
['10.0.0.45','192.168.123.4']
答案 0 :(得分:6)
我猜,
(?m)(?:\d+\.){3}\d+$
可能只需提取所需的IP。
import re
string = '''
4:16:09PM - xx yy DOS activity from 10.0.0.45
9:43:44PM - xx yy 1A disconnected from server
2:40:28AM - xx yy 1A connected
1:21:52AM - xx yy DOS activity from 192.168.123.4
'''
expression = r'(?m)(?:\d+\.){3}\d+$'
print(re.findall(expression, string))
['10.0.0.45', '192.168.123.4']
如果您想简化/更新/探索表达式,请在regex101.com的右上角进行解释。如果您有兴趣,可以观看匹配的步骤或在this debugger link中进行修改。调试器演示了a RegEx engine如何逐步使用一些示例输入字符串并执行匹配过程的过程。
jex.im可视化正则表达式:
答案 1 :(得分:2)
也可以采用这种方法,还可以检查行中的最后一个字符是否为数字:
with open('test.log') as f:
for line in f:
if line.strip()[-1].isdigit():
dos = re.findall('[0-9]+.[0-9]+.[0-9]+.[0-9]+',line)
print(dos)
输出:
['10.0.0.45']
['192.168.123.4']
要将它们放入一个列表中,您可以定义一个空列表,并根据需要不断添加到该列表中
答案 2 :(得分:0)
我在Ips中使用了一种简单的正则表达式模式。
import re
with open(r'C:\Users\Desktop\test.log') as f:
for line in f:
dos= re.findall( r'[0-9]+(?:\.[0-9]+){3}', line )
if dos:
print (dos)
输出
['1.0.0.45']
['192.168.123.4']