2013-04-26 3 views
0

Я в настоящее время борется с фильтрацией по регулярному выражению в Python. Я выполняю команду через ssh, и я поймаю ее в stdout. Здесь все идет хорошо, но сложная часть приходит. Выход файла, загруженного в stdout, следующий:Python Regex, чтобы найти последнее появление цифры

Команда выполнена успешно. server.jvm.memory.maxheapsize-count-count = 518979584

Команда выполнена успешно. server.jvm.memory.maxheapsize-кол-кол = 518979584

(это несколько раз). Чем я буду выполнять регулярное выражение:

stdin, stdout, stderr = ssh.exec_command('cat ~/Desktop/jvm.log') 
result = stdout.readlines() 
result = "".join(result) 
print(result) 
line = re.compile(r'\d+\n') 
rline = "".join(line.findall(result)) 
print(rline) 

печати (RLINE) результаты в

>> 518979584 

>> 518979584 

>> 518979584 

(также несколько раз). Я хочу только распечатать его. При печати rline [0] я получаю только первое число всей цифры. Я думал об использовании $, но это никому не помогает?

+1

Вы можете просто использовать 'RLINE [-1]', чтобы получить последний результат. – poke

+0

use set: '." .join (line.findall (set (result))) ', он содержит только уникальные значения. –

ответ

1

ваша линия:

rline = "".join(line.findall(result)) 

является преобразование списка возвращается форма findall в строку, которая затем приводит к rline[0] возвращает первый символ в строке.

просто получить элемент из line.findall(result)[0]

, как показано в примере ниже

>>> d = ''' 
    Command get executed successfully. server.jvm.memory.maxheapsize-count-count =  518979584 
... 
...  Command get executed successfully. server.jvm.memory.maxheapsize-count-count = 518979584 
... ''' 
>>> d 
'\n\n Command get executed successfully. server.jvm.memory.maxheapsize-count-count = 518979584\n\n Command get executed successfully.  server.jvm.memory.maxheapsize-count-count = 518979584\n' 
>>> import re 
>>> line = re.compile(r'\d+\n') 
>>> rline = "".join(line.findall(d)) 
>>> rline 
'518979584\n518979584\n' 
>>> line.findall(d) 
['518979584\n', '518979584\n'] 
>>> line.findall(d)[0].strip() # strip() used to remove newline character - may not be needed 
'518979584' 
+0

отлично, это работает, что делает функция .strip()? – Nicholas

+0

полоса была добавлена ​​только для удаления символа конца строки '\ n' из строки. возможно, вводит в заблуждение, поскольку это могло быть введено в моей копии-вставки вашей строки. –

2

Ну, это должно дать вам то, что вы хотите.

(\d+)\D*$ 

Просто выполните поиск, и это даст вам последнее число, которое происходит.

>>> regex = re.compile(r"(\d+)\D*$") 
>>> string = "100 20gdg0 3gdfgd00gfgd 400" 
>>> r = regex.search(string) 
# List the groups found 
>>> r.groups() 
(u'400',) 
0
  • Это никогда не является хорошей идеей, чтобы смешивать оболочку и Python - когда вы можете сделать все в Python (например, ваш случай)
  • Нет необходимости в регулярных выражениях
  • set() обеспечивает уникальность

    with open(<your file name>) as in_file: 
        counts = set(line.rpartition(' ')[2] for line in in_file) 
    
+0

это также возможно, когда вы делаете это через SSH с парамико? Как скрипт знает, что файл не находится в собственной системе? – Nicholas

+0

@Nicholas, я не знаю paramico, но до тех пор, пока вы получаете текстовый вывод в любой форме с помощью итератора строки, этот код будет работать. Если paramico предоставляет итератор файлового стиля - это сработает.Если это не так - вы можете проверить, что более эффективно - используя _re_ или итератор по раздробленному тексту. – volcano