我有一个子进程命令
temp = subprocess.check_output(cmd)
这会返回单个字符串
该字符串将包含每张有许可证的记录
的数据For Instance,
如果当前只有一个带有许可证的记录:字符串将如下所示:
b'Setting license file path to 5053@100.113.111.61\r\n\r\n\t------------------------\r\n\r\n\tredgiant license usage status on 100.113.248.61 (port 55952)\r\n\r\n\tmagicbulletlooks v999.9: administrator@nynle650 1/0 at 02/29 09:51 (handle: 62)\r\n\r\n'
如果有两个带许可证的记录,它将如下所示:
b'Setting license file path to 5053@100.113.111.61\r\n\r\n\t--------------------
----\r\n\r\n\tredgiant license usage status on 100.113.111.61 (port 55952)\r\n\r
\n\tmagicbulletlooks v999.9: administrator@nynle650 1/0 at 02/29 11:42 (handle:
68)\r\n\tmagicbulletlooks v999.9: administrator@nynle647 1/0 at 02/29 11:46 (h
andle: 8d)\r\n\r\n'
随着数量的增长,等等等等。
我试图提取magicbulletlooks v999.9: administrator@nynle647 1/0 at 02/29 11:46
部分,就像它出现在列表中一样多次。
对于每次出现,列表中应该有一个项目。
目前我正在使用
def do_work():
regex= re.compile("magicbulletlooks(.*\))")
t = subprocess.check_output(my_cmd)
return re.findall(regex,str(t))
但是,这只返回一个包含1个值的列表,该值从头到尾具有完整的字符串,并且不存储单个事件。
基本上我想要达到的目标是使用正则表达式来创建一个列表:
['magicbulletlooks v999.9 administrator@nynle647 1/0 at 2/29 11:46',
'magicbulletlooks v999.9 administrator@nynle650 1/0 at 2/29 11:42'
]
答案 0 :(得分:0)
作为对您的模式的修复,我可以想出:
>>> re.findall('magicbulletlooks.*\d+', s)
['magicbulletlooks v999.9: administrator@nynle650 1/0 at 02/29 11:42', 'magicbulletlooks v999.9: administrator@nynle647 1/0 at 02/29 11:46']
现在你的功能:
def do_work():
pat = re.compile('magicbulletlooks.*\d+')
t = subprocess.check_output(my_cmd)
return pat.findall(str(t))
修改强> 引自文档:
subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False, timeout=None)
使用参数运行命令并返回其输出。...
这相当于:
默认情况下,此函数将以编码字节的形式返回数据。该 输出数据的实际编码可能取决于命令 调用,所以解码到文本往往需要在处理 应用程序级别。
可以通过将universal_newlines设置为True来覆盖此行为 如上面在常用参数中所述。
所以你有几个选择:
1 - 将universal_newline
标记设为True
为:
t = subprocess.check_output(my_cmd, universal_flag=True)
pat = re.compile('magicbulletlooks.*\d+')
return pat.findall(t)
2 - 将re
表达式中的模式指定为binary-like
对象:
pat = re.compile(b'magicbulletlooks.*\d+')
t = subprocess.check_output(my_cmd)
return pat.findall(t)
3 - 将binary-like
对象解码为utf-8
(如果处理Python3则更可取)或ascii
字符串:
>>> t = subprocess.check_output(my_cmd)
>>>
>>> re.findall('magicbulletlooks.*\d+', t.decode('utf-8'))
['magicbulletlooks v999.9: administrator@nynle650 1/0 at 02/29 11:42', 'magicbulletlooks v999.9: administrator@nynle647 1/0 at 02/29 11:46']
>>>
>>> re.findall('magicbulletlooks.*\d+', t.decode('ascii'))
['magicbulletlooks v999.9: administrator@nynle650 1/0 at 02/29 11:42', 'magicbulletlooks v999.9: administrator@nynle647 1/0 at 02/29 11:46']