2013-05-31 4 views
0
html_log:jeff 1153.3 1.84 625:54 1 2 71 3 2 10 7:58 499 3 5 616:36 241 36   
html_log:fred 28.7 1.04 27:34 -10 18 13 0:48 37 18 8 -3.63 
html_log:bob 1217.1 1.75 696:48 1 5 38 6 109 61 14:42 633 223 25 435:36 182 34 
... continues 

это текстовый файл.python regular expression top 10

mystats = fo.readlines() 
fo.close() 

change = str(mystats) 

pattern = re.compile("html_log:(?P<name>[^ ]*) (?P<score>[^ ]*)") 
mylist=sorted(pattern.findall(change), key=lambda x: float(x[1]), reverse=True) 

мой выход теперь

bob 1217.1 
jeff 1153.3 
fred 28.7 

Вопрос .. Я пытаюсь получить 5-INT значение, однако и мой вывод должен быть

bob 5 
jeff 2 
fred 18 

Я не знаю, чтобы соответствовать только 5-му значению.

+1

Я не вижу, где «топ-10» относится к вашему вопросу? Вы после 5-го элемента со входа (как показывает ваш пример) или 5-й после сортировки? –

ответ

1

Как об этом регулярном выражении:

html_log:(?P<name>[^ ]*)(?: [^\s]+){4} (?P<score>[^ ]*) 

См here для теста.

2

Вам не нужно регулярное выражение для этого.

s = [line.split() for line in file] 
[(x[0].split(':')[1], float(x[5])) for x in s] 
+0

Где имя человека 'bob' или' jeff'. –

+0

Посмотрите в 'split [0]'. – tripleee

0

немного более традиционный, но выживает короткие или пустые строки:

import io # Python 3 use StringIO in Python 2 
fobj = io.StringIO(""" 
html_log:jeff 1153.3 1.84 625:54 1 2 71 3 2 10 7:58 499 3 5 616:36 241 36   
html_log:fred 28.7 1.04 27:34 -10 18 13 0:48 37 18 8 -3.63 
html_log:bob 1217.1 1.75 696:48 1 5 38 6 109 61 14:42 633 223 25 435:36 182 34""") 

scores = [] 
for line in fobj: 
    split_line = line.split() 
    try: 
     scores.append((int(split_line[5]), split_line[0].split(':')[1])) 
    except IndexError: 
     continue 

Нам нужно сортировать. Чем больше, тем лучше:

top_ten = sorted(scores, reverse=True)[:10] 

И показать им немного лучше:

for score, name in top_ten: 
    print(name, score) 

Выход:

fred 18 
bob 5 
jeff 2 
+0

эквивалентно простому 'if' в понимании списка. – Elazar

+0

Я думаю, вы имеете в виду 'if len (line.split())> 5'. Это сделало бы еще один раскол линии. И есть также имя, которое ищет OP. Не знаете, как получить имя со списком, не разбивая линию еще раз на три сплита. И имя должно быть отделено от 'html_log:' при чтении строки за строкой из файла. –

0

Используйте этот шаблон:

pattern = re.compile(r'html_log:([^ ]*) (?:[^ ]+){4}([^ ]*)') 

Он пропускает 4 номера и захватывает пятый.