2015-01-22 2 views
1

Я пытаюсь разделить имя службы и ее статус с помощью регулярного выражения.Стоп после первого совпадения

Это прекрасно работает:

message = "svnserve is stopped" 
match = re.search(r"(.*)\s+is\s+(\w*)", message) 
print match.group(1),match.group(2) 
# output=> svnserve stopped 

но когда я нашел линию, как это он не работает:

message = "openssh-daemon (pid 1982) is running" 
match = re.search(r"(.*)\s+is\s+(\w*)", message) 
print match.group(1),match.group(2) 
# output => openssh-daemon (pid 1982) running 

Как я могу удалить (pid 1982); Я просто хочу имя и состояние.

Любая помощь?

+0

Обратите внимание, что я изменил имя переменной с 'str' на' message'. Вы никогда не должны вводить определяемое пользователем имя так же, как один из встроенных модулей. Это затмевает встроенное имя и делает его непригодным для использования в текущей области. – iCodez

+0

Я изменил его прямо сейчас :), но в моем коде, конечно, сейчас не так –

ответ

0
re.search(r"(.*)\s+is\s+(\w*)",str) 

Это регулярное выражение принимает что-либо до первого места в своей первой группе, затем сопоставляет слово «есть» неустановленный количество пробелов с обеих сторон , затем после этого вводится строка с буквенным символом в виде следующей группы. Эта вторая группа включает пробелы. Лучшей стратегией было бы взять первое и последнее слово, разделенное пробелами. Попробуйте

match = re.search(r"^([\S]+).*\s([\S]+)$",str) 
+0

спасибо, что это хорошо работает –

1

Имя службы всегда будет первым словом в строке, и его состояние всегда будет последним. Таким образом, вы можете просто разделить строку и захватить эти два элемента непосредственно:

message = "svnserve is stopped" 
match = message.split() 
print match[0], match[-1] 

Demo:

>>> message = "svnserve is stopped" 
>>> match = message.split() 
>>> print match[0], match[-1] 
svnserve stopped 
>>> 
>>> message = "openssh-daemon (pid 1982) is running" 
>>> match = message.split() 
>>> print match[0], match[-1] 
openssh-daemon running 
>>> 
+0

спасибо, но мне нужно использовать регулярное выражение, потому что я получаю услуги от разных ОС, поэтому просто хочу изменить шаблон и индекс. –

+0

Ну, в этом случае вы можете использовать шаблон, такой как: 'r" (. *?) \ S. *? Is \ s (\ w *) ". Важной частью являются символы '?', Которые делают совпадающие неживые (они соответствуют как можно меньше). Тем не менее, я уверен, что использование Regex не нужно, так как ваши данные очень упорядочены. Части, которые вы хотите, всегда находятся в одном и том же месте. – iCodez

1

Вы можете использовать функцию re.findall сделать глобальный матч. \S+ соответствует одному или нескольким символам без пробела.

>>> m = re.findall(r'^\S+|\S+$', message) 
>>> print(m[0],m[1]) 
svnserve stopped 
>>> message = "openssh-daemon (pid 1982) is running" 
>>> m = re.findall(r'^\S+|\S+$', message) 
>>> print(m[0],m[1]) 
openssh-daemon running 

ИЛИ

Если вы хотите кормить \s+is\s+ в ваше регулярное выражение попробуйте ниже.

>>> message = "openssh-daemon (pid 1982) is running" 
>>> m = re.search(r'^(\S+).*?\s+is\s+.*?(\S+)$', message) 
>>> print(m.group(1),m.group(2)) 
openssh-daemon running 

Или вы могли бы просто использовать re.search(r'^(\S+).*?(\S+)$', message)

Смежные вопросы