Python объединить три строки .split() в одну строку?

#python #split

#python #разделить

Вопрос:

У меня есть этот код, в котором я надеюсь, что три команды разделения могут быть объединены в одну строку, но я не могу понять, как:

 from __future__ import print_function       # Must be first import
import subprocess32 as sp

def get_mouse_coordinates():
    ''' Get mouse co-ordinates with xdotool:
            $ xdotool getmouselocation
            x:4490 y:1920 screen:0 window:65011722
    '''
    command_line_list = ['xdotool', 'getmouselocation']

    pipe = sp.Popen(command_line_list, stdout=sp.PIPE, stderr=sp.PIPE)
    text, err = pipe.communicate()              # This performs .wait() too

    print("returncode of subprocess:",pipe.returncode)

    if text:
        x, y, z = text.split(' ',2)             # Grab 'x:9999' 'y:9999' 'junk'
        x_ret = x.split(':')[1]                 # Grab right of 'x:9999'
        y_ret = y.split(':')[1]                 # Grab right of 'y:9999'

        print("standard output of subprocess:")
        print(text,'x-offset:',x_ret,'y-offset:',y_ret)
        return x_ret, y_ret

    if err:
        print("standard error of subprocess:")
        print(err)
        return 100, 100
  

Вероятно, совершенно очевидно, но это три строки кода:

 x, y, z = text.split(' ',2)             # Grab 'x:9999' 'y:9999' 'junk'
x_ret = x.split(':')[1]                 # Grab right of 'x:9999'
y_ret = y.split(':')[1]                 # Grab right of 'y:9999'
  

Если вам интересно, выведите в терминале:

 returncode of subprocess: 0
standard output of subprocess:
x:3400 y:558 screen:0 window:23073340
 x-offset: 3400 y-offset: 558
  

Комментарии:

1. В этих 3 разделениях нет ничего плохого. Вы также можете использовать регулярное выражение, если считаете, что так лучше.

2. Что вы подразумеваете под «объединением»? Вы говорите о стиле кодирования или о выходе ? Если вы говорите о выводе, то в чем именно разница между выводом, который вы показали, и выводом, который вы хотите ? Если вы говорите о стиле кодирования, то почему вам не нравится код, который у вас есть?

3. @KarlKnechtel Извините, я не был ясен. Я хочу объединить три строки кода в одну. Вывод предназначен только для отладки и в окончательной версии будет закомментирован или удален.

4. О, я неправильно понял; у вас есть вторые две строки, зависящие от первой.

Ответ №1:

Как упоминал @zvone, один из способов сделать это — использовать регулярное выражение. По сути, вы просто пытаетесь извлечь числа, поэтому шаблон довольно прост:

     import re
    
    x, y, screen, window = re.findall("[0-9] ", text)
  

Обратите внимание, что если бы числа могли быть отрицательными, вам понадобился бы немного более длинный шаблон (но, похоже, в вашем случае их не будет):

     import re
    
    x, y, screen, window = re.findall("[- ]?[0-9] ", text)
  

Документация для модуля регулярных выражений:https://docs.python.org/3/library/re.html

Вы также могли бы использовать понимание списка:

     x, y, screen, window = [tok.split(":")[1] for tok in text.split(" ")]