#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(" ")]