如果我使用python创建一个包含要删除的If列表的文件,然后将该文件作为正则表达式规则列表提供给grep,我可以获得我想要的结果,但不能单独使用python。
该脚本从微软下载Office365规则更改的JSON提要。
然后,它只对“删除”更改起作用。
我已经尝试使用re和一个简单的字符串比较,都没有产生任何结果或错误。
ips = changes['ips'] if 'ips' in changes else []
ip4s = [ip for ip in ips if '.' in ip]
for ip in ip4s:
ip_rule = 'net:' + ip
with open('/etc/shorewall/rules', 'r') as rules_file:
with open('/tmp/rules', 'w') as tmp_rules_file:
for line in rules_file:
if not ip_rule in line:
tmp_rules_file.write(line)实际的脚本有3个部分,分别是正则表达式URL、域和IP。
前两个可以工作,但IP部分不行。它不会出现任何错误或任何更改。
应该发生的是,它创建了一个临时文件,该文件不包含应该删除的shorewall规则。
然后,当我vimdiff旧的规则文件和临时文件时,我可以看到需要删除的内容。
实际结果是两个文件完全相同。
在python之外的进一步测试表明,有211行应该被删除。
我是python的新手,所以假设我被什么东西绊倒了,只是看不到它。
发布于 2019-05-17 20:08:22
让我们用一个带有列表的小例子来尝试一下,而不是使用文件。你可以做for line in file或for line in list,所以从长远来看,你可以做一个函数,你可以把任何可迭代的东西都发送进去。这意味着你可以编写单元测试,展示最小的例子来获得帮助。
那么,让我们有我们的ips
ip4s=["1.1.1.1", "2.2.2.2"]以及输入和输出“文件”:
rules_file = ['net:1.1.1.1', 'net:3.3.3.3']
tmp_rules_file = [](例如-假设您可以使用正则表达式来获取所需的格式)
正确的。所以,当我们做循环时:
for ip in ip4s:
ip_rule = 'net:' + ip
for line in rules_file:
if not ip_rule in line:
tmp_rules_file.append(line)因此,对于每个规则,我们查看旧规则文件中的每一行,一次查看一行。没有"1.1.1.1"的每一行都会被写入...
在本例中,1.1.1.1与第一个IP匹配,因此不会写入tmp_rules_file。但是,3.3.3.3不匹配,因此写入tmp_rules_file。
下一个IP是2.2.2.2 -这两行都不匹配,因此当您(再次)回顾整个文件时,规则文件的两行都会放入临时文件中,最后是:
>>> tmp_rules_file
['net:3.3.3.3', 'net:1.1.1.1', 'net:3.3.3.3']这显示了哪里出了问题。
要在一个列表中查找不在另一个列表中的内容,您可以使用列表理解:
[ip for ip in ip4s if 'net:'+ip not in rules_file]在本例中,这只给出了['2.2.2.2']。
对于较大的数据,您可能希望使用集合并尝试设置差异操作。
您的问题的主要部分是针对文件的每一行检查一项-如果它与一行匹配,则不会与其他行匹配,因此将被写回。
发布于 2019-05-17 20:29:08
您可以使用以下正则表达式查找所有IPv4和IPv6地址。您应该将J-son文件作为一个简单的字符串读取。set可以过滤列表中重复的元素。
import re
json_as_str = """
"version": "2019042900",
"impact": "AddedUrl",
"add": {
....
....
....
]
"""
ip_four = list(set(re.findall(r"(?:\d{1,3}\.){3}\d{1,3}(?:/\d\d?)?", json_as_str)))
ip_six = list(set([x[0] for x in re.findall(r"(([0-9a-fA-F]{0,4}:){1,7}[0-9a-fA-F]{0,4})", json_as_str)]))
print("IPv4: %r" % ip_four)
print("IPv6: %r" % ip_six)
print("Number of Ipv4: %s" % len(ip_four))
print("Number of Ipv6: %s" % len(ip_six))输出:
>>> python test.py
IPv4: [... many many items ...]
IPv6: [... many many items ...]
Number of Ipv4: 324
Number of Ipv6: 379https://stackoverflow.com/questions/56185737
复制相似问题