Python脚本协助

时间:2015-10-20 05:37:58

标签: python regex

我对python脚本非常陌生,但我想将类似下面的字符串复制/粘贴到脚本中,该脚本以特定格式打印出结果。我希望下面的每个值都打印出来,我很确定需要正则表达式,即:要解析IP值我会使用以下正则表达式 ^(?:[0-9] {1,3}。 ){3} [0-9] {1,3} $ 的。我只是不确定如何将它合并到脚本中。

要复制/粘贴的字符串示例:


病毒:Stuxnet
电脑:HP_1234
域名:ABC \
IP:192.168.10.1
用户:user1
文件:C:\ Users \ user1 \ AppData \ Local \ Microsoft \ Windows \ malo.png
日期/时间:2015年10月19日22:23:57
结果:清理
病毒扫描引擎:421.6000.1009
病毒码:419.9890.0009

到目前为止我在编码方面拼凑起来的片段:

#!/usr/bin/python
import re

alert = raw_input("Copy/paste alert and press Enter:\n\n\n ").split()

print "==============================================================\n\n"

print"Please take a look at the following issue. \n\n"

print "Infection Name:"
print "IP Address:"
print "Infected file location:"
print "Date/Time: "
print "Domain: "

我如何解析复制/粘贴的字符串并从此解析中填写相应的字段?我认为re.findall可能是解决方案,但似乎不起作用。我认为将.split添加到raw_input的末尾将允许我使用%s作为变量,我认为这使我走上了正确的轨道,但我又不确定。很抱歉,如果这个描述不清楚..我是脚本的新手。

1 个答案:

答案 0 :(得分:1)

如果你只是需要输入数据并格式化它的呈现方式,似乎一个简单的解析器可能会起作用:

首先将字符串剪切并粘贴到文本文件中(我称之为cut_and_paste.txt):

Virus: Stuxnet
Computer: HP_1234
Domain: ABC\
IP: 192.168.10.1
User: user1
File: C:\Users\user1\AppData\Local\Microsoft\Windows\malo.png
Date/Time: 10/19/2015 22:23:57
Result: Cleaned
Virus Scan Engine: 421.6000.1009
Virus Pattern: 419.9890.0009

现在您可以加载文件并使用非常简单的脚本将字符串解析为Python dict:

with open('cut_and_paste.txt', 'r') as infile:
    data = dict()
    for line in infile:
        pair = line.strip().split(':')
        data[pair[0]] = pair[1]

请注意,这可以做得更多" Python"但是我使用了一个更容易理解的表单,因为你说的不熟悉脚本。

基本思路是以读取模式打开文件(' r')并将其命名为“infile'”,然后创建一个Python字典,允许您将数据组织到key:值对。对于文件中的每一行" strip"该行,删除任何空格(在本例中基本上是换行符)然后在冒号上拆分行。最后,通过设置dict [key] = value来填充字典,因此在下一行中,冒号左边的所有内容都成为一个键,右边的所有内容都成为一个值。

生成报告时,您可以使用密钥恢复数据:

print 'Take a look at the following issue:'

print 'Infection Name:', data['Virus']
print 'IP Address:', data['IP']
...
...

如果你只想制作一个这样的简单报告,那么文件解析应该可以解决问题。如果你想做一些更复杂的价值观,Regex会发挥作用。例如,您可能希望查找某个范围内的IP地址等。

但是,从我可以从问题中收集的内容来看,似乎这样一个非常简单的解析器应该可以解决这个问题。

希望有所帮助

根据您的后续问题进行编辑:

有一种更健壮的方法可以从字典中恢复价值(我可能应该在原始答案中使用它,但我试图保持简单)

从字典中获取数据的传统方法如原始答案中所述:

print data['key']

这很简单,但是如果密钥不存在,就会发现KeyError会抛出KeyError。您可以通过一些小修改来解决这个问题,以使用字典的get方法:

print data.get(key)

print data.get(key, default)

在这两种情况下,我都有一个字符串 key ,表示您要查找的任何键。

如果我修改部分报告生成代码(例如)导致密钥不存在的拼写错误,您可以看到它们是如何工作的:

print 'Infection Name:', data.get('Virusx')

print 'Infection Name:', data.get('Virusx', 'Not Found')

原始代码会引发KeyError,这些 这些都产生以下输出:

Infection Name: None

Infection Name: Not Found

在第一种情况下,当' Virusx'在字典中找不到默认行为是返回None,然后将其转换为字符串'无'

此方法还允许您添加第二个参数,该参数定义了当无法找到密钥时Python希望如何响应。在这种情况下,我告诉Python返回一个字符串' Not Found'尽管你可以用任何字符串替换它以满足你的需要。例如,返回空字符串可以是指示缺失数据的有效方法。

第二次修改

根据新信息,您似乎需要使用 split 方法的 maxsplit 选项。这允许您指定" splits"的最大数量,它的工作方式如下:

input_string = 'File: C:\Windows'

insufficient = input_string.split(':')
print insufficient

correct = input_string.split(':', 1)
print correct

我把结果放在一起,以使差异更明显:

insufficient --> ['File', ' C', '\\Windows']
correct -->      ['File', ' C:\\Windows']

基本上听起来好像字符串被拆分了很多次,而你很可能只访问了前两个部分(因此丢失了剩下的部分)。