python正则表达式前10名

时间:2013-05-31 10:19:39

标签: python regex list dictionary

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

以上是文本文件。

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个值的模式。

4 个答案:

答案 0 :(得分:2)

你真的不需要正则表达式。

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

答案 1 :(得分:1)

这个正则表达式怎么样:

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

请参阅here进行测试。

答案 2 :(得分: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

答案 3 :(得分:0)

使用此模式:

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

它跳过4个数字并捕获第五个数字。