Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python脚本帮助_Python_Regex - Fatal编程技术网

Python脚本帮助

Python脚本帮助,python,regex,Python,Regex,我对python脚本非常陌生,但我想将类似于下面的字符串复制/粘贴到以特定格式打印结果的脚本中。我希望打印下面的每个值,并且我非常确定需要正则表达式,即:要解析IP值,我将使用以下正则表达式^(?[0-9]{1,3}。){3}[0-9]{1,3}$。我只是不知道如何把它融入脚本中 要复制/粘贴的字符串示例: #!/usr/bin/python import re alert = raw_input("Copy/paste alert and press Enter:\n\n\n ").spli

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

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

#!/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: "

病毒: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将允许我使用%s作为变量,我认为这使我走上了正确的轨道,但我还是不确定。抱歉,如果这个描述不清楚..我还是一个全新的脚本编写者

如果您只需要输入数据并格式化数据的显示方式,那么一个简单的解析器似乎可以工作:

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

现在,您可以加载该文件并使用一个非常简单的脚本将字符串解析为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]
请注意,这可以更“Pythonically”地完成,但我使用了一种更易于遵循的表单,因为您说过我不太熟悉脚本

基本思想是以读取模式(“r”)打开文件并称之为“infle”,然后创建一个Python字典,它允许您将数据组织成键:值对。对于文件中的每一行“剥离”该行,删除所有空白(本例中基本上是换行符),然后在冒号上拆分该行。最后,通过设置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']
这是简短而简单的,但正如您所发现的,如果密钥不存在,将抛出一个密钥错误。您只需稍作修改即可使用字典的get方法解决此问题:

print data.get(key)

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

如果我修改了报告生成代码的一部分(例如)导致键不存在的打字错误,您可以看到这些代码是如何工作的:

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

print 'Infection Name:', data.get('Virusx', 'Not Found')
虽然原始代码会抛出一个keyrerror,但是 它们各自产生以下输出:

Infection Name: None

Infection Name: Not Found
在第一种情况下,当在字典中找不到“Virusx”时,默认行为是返回None,然后将其转换为字符串“None”

此方法还允许您添加第二个参数,该参数定义在找不到键时希望Python如何响应。在本例中,我告诉Python返回一个字符串'notfound',尽管您可以根据需要将其替换为任何字符串。例如,返回空字符串可以有效地指示缺少的数据

第二次编辑

根据新信息,您似乎需要使用split方法的maxsplit选项。这允许您指定“拆分”的最大数量,其工作原理如下:

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']

基本上,听起来好像字符串被拆分了太多次,而您可能只访问了前两段(因此,丢失了剩余部分)。

您能提供一个您想要的输出示例吗?谢谢!工作完美。现在我正在研究如何处理数据丢失时出现的错误,这种情况时有发生。我正在回溯的错误(最近一次调用上次):文件“tm_1.0.py”,第24行,打印的“IP地址:”,data['IP']KeyError:'IP'要处理这个问题,我认为调整代码使其看起来像以下内容会有所帮助,但这似乎不起作用:使用open('c_p.txt','r')作为infle:data=dict()对于infle中的行:try:pair=line.strip().split(“:”)data[pair[0]]=pair[1]除了KeyError:print(“”)我刚刚编辑了答案,添加了一些额外的信息和轻微的修改,这将有助于解决此问题。太棒了。谢谢最后一件事,我正在复制/粘贴的字符串中有一个区域,读作'File:C:\Windows',但当我打印时,第二个冒号之后的所有内容都会被去掉
因此:

打印“受感染的文件位置:”,data.get('File','')

给我**C**

而不是C:\Windows\which
好的,我想我看到问题了。请查看最新更新以获取解释。干杯
insufficient --> ['File', ' C', '\\Windows']
correct -->      ['File', ' C:\\Windows']