解析python中列表项中的特定字符串



我在python中有以下代码,其中包含调试SSH的日志消息。

for log_item in ssh_log:
print(log_item.rstrip())
#will show ...
2022-04-06 01:55:15,085 10.x Remote version/idstring: SSH-2.0-ConfD-4.3.11.4
2022-04-06 01:55:15,085 20.x Connected (version 2.0, client ConfD-4.3.11.4)
2022-04-06 01:55:15,161 10.x kex algos:['diffie-hellman-group14-sha1'] server key:['ssh-rsa']
...

获取粗体值的方法是什么?assign my variables,可能是一些正则表达式作为for循环的一部分,或者其他什么方法来获得以下内容:

idstring = SSH-2.0-ConfD-4.3.11.4
kex_algos = ['diffie-hellman-group14-sha1']
key_type = ['ssh-rsa']

不带正则表达式的解决方案。请参阅下面的联机评论。

for log_item in ssh_log:
line = log_item.rstrip()
if 'idstring' in line:
print('idstring = ',line.split(':')[-1]) #Pick last value after ':'
if 'kex algos' in line:
print('kex algos = ', line[line.find('['):line.find(']')+1]) #find between first set of square brackets.
if 'key:' in line:
key = line.split('key:')[1] #Get values after 'key:'
print('key_type = ', key)

如果需要,可以将打印更新为变量分配。

如果所有数据的格式与此处给出的数据相同,则可以使用以下正则表达式:

import re
a = """
2022-04-06 01:55:15,085 10.x Remote version/idstring: SSH-2.0-ConfD-4.3.11.4
2022-04-06 01:55:15,085 20.x Connected (version 2.0, client ConfD-4.3.11.4)
2022-04-06 01:55:15,161 10.x kex algos:['diffie-hellman-group14-sha1'] server key:['ssh-rsa']"""
idstring = re.findall("idstring: (.*)", a)[0] # Remove zero to get a list if 
# multiple values are present
print(idstring)
kex_algos = re.findall("algos:['(.*)'] ", a)
print(kex_algos)
key_type = re.findall("key:['(.*)']", a)
print(key_type)

输出:

'SSH-2.0-ConfD-4.3.11.4'
['diffie-hellman-group14-sha1']
['ssh-rsa']

如果数据具有类似的结构,您也可以使用http模板来解析数据。

from ttp import ttp
import json
with open("log.txt") as f:
data_to_parse = f.read()
ttp_template = """
{{ignore}} {{ignore}} {{ignore}} {{ignore}} version/idstring: {{version_id_string}}
{{ignore}} {{ignore}} {{ignore}} {{ignore}} algos:{{key_algos}} server key:{{key_type}}
"""
parser = ttp(data=data_to_parse, template=ttp_template)
parser.parse()
# print result in JSON format
results = parser.result(format='json')[0]
# print(results)
result = json.loads(results)
# print(result)
for i in result:
print(i["key_algos"])
print(i["key_type"])
print(i["version_id_string"])

输出为:

['diffie-hellman-group14-sha1']
['ssh-rsa']
SSH-2.0-ConfD-4.3.11.4

使用文件中原始问题的3行样本数据,可以采用以下方法:

import re
with open('ssh.log') as sshlog:
for line in map(str.strip, sshlog):
_, _, _, kw, *rem = line.split()
match kw:
case 'Remote':
print(f'ID string = {rem[-1]}')
case 'kex':
m = re.findall("(?<=[').+?(?='])", line)
print(f'algos = {m[0]}')
print(f'type = {m[1]}')
case _:
pass

这里的假设是,只有关键字为"Remote"或"kex"的行才感兴趣。

输出:

ID string = SSH-2.0-ConfD-4.3.11.4
algos = diffie-hellman-group14-sha1
type = ssh-rsa

最新更新