Python - 基于特定字符

时间:2016-01-04 14:46:17

标签: python string split subprocess slice

Python中的

subprocess具有32,000个字符的字符限制或大约。我使用subprocess打开一个exe并传递一系列命令,并清除字符限制。

我的工作是将命令串分成两部分并调用subprocess两次。我知道我可以按如下方式切割字符串:

commands = '-a 10.162.5.5 399@0000:55:01=0 -a 10.162.5.5 299@0000:55:01=1 -a 10.162.5.5 599@0000:55:01=0 -a 10.162.5.5 699@0000:55:01=0 -a 10.162.5.5 399@0000:55:01=0 -a 10.162.5.5 399@0000:55:01=0 -a 10.162.5.5 499@0000:55:01=1 -a 10.162.5.5 399@0000:55:01=0 -a 10.162.5.5 399@0000:55:01=0 -a 10.162.5.5 399@0000:55:01=0 -a 10.162.5.5 399@0000:55:01=0 -a 10.162.5.5 399@0000:55:01=0 -a 10.162.5.5 799@0000:55:01=34'

print(commands[:len(commands)/2])

print(commands[len(commands)/2:])

不幸的是,每个命令都采用某种格式:-a 10.162.5.5 799@0000:55:01=34 例如,因为我可以将一个单一的命令减半,所以只是直接的分裂不会起作用。

另一个想法是尝试以特定模式分割字符串:

commands.split(' -')[commands.count('-')/2]

返回序列中的中间完整命令。

2 个答案:

答案 0 :(得分:0)

如果所有命令都以-a命令开关开头,那么您可以使用它作为快速而又脏的方式来分割每个命令:

import re
re.findall( "-a[^-]*", commands )

以上并不是超级理想的,因为如果遇到连字符(例如,如果有任何负数),它会提前破坏命令。这是一种更强大的方法,它还可以处理其他单字母命令行开关(例如-b-c等):

import itertools
import re
starts = [match.start() for match in re.finditer( "-[a-z]", commands )]
commandList = [commands[start:end] for start, end in itertools.zip_longest( starts, starts[1:] )]

以上内容是为Python 3.x编写的。如果您使用的是Python 2.6+,则需要将zip_longest替换为izip_longest。看看你如何调用可执行文件,你可能希望一次批量处理多个命令,以减少重复调用可执行文件的开销。您可以重复连接多达某个预定长度的命令,也可以修改可执行文件以接受包含命令的某种批处理文件(很可能是更好的选项)。

答案 1 :(得分:0)

def execute_command(commands):
"""
Execute the commands sent in the 'commands' parameter using the program
specified in the 'program' parameter.
:param commands: A command or sequence of commands
"""
#If the command string is greater than 31,000 characters
if len(commands) > 31000:
    print(len(commands))
    #Find all indices of '-' which represent the start of a new command
    index_start_command = [match.start() for match in re.finditer(re.escape('-'), commands)]
    #split the command string into two, do this by counting the number of times '-' occcurs, half it
    #and return the index of that occurance from the start list.
    commands_one = commands[:index_start_command[commands.count('-')/2]]
    commands_two = commands[index_start_command[commands.count('-')/2]:]
    subprocess.Popen([program, commands_one]).communicate()
    subprocess.Popen([program, commands_two]).communicate()
else:
    subprocess.Popen([program, commands]).communicate()

我设法把一些东西放在一起,做了我想做的事情,似乎有效。我以为我会把它放在任何可能正撞在墙上的人身上。