列表

时间:2016-02-29 16:58:52

标签: python regex

我有一个子进程命令

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

enter image description here

1 个答案:

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