使用正则表达式读取和处理文件

时间:2012-12-01 21:36:59

标签: python regex file-io

我有一个庞大的文件,只有这些块的重复单元:

//WAYNE ROONEY (wr10)
  90 [label="90"];
  90 -> 11 [weight=25];
  90 -> 21 [weight=23];
  90 -> 31 [weight=17];
  90 -> 41 [weight=12];
  90 -> 51 [weight=1];
  90 -> 62 [weight=50];
  90 -> 72 [weight=7];
  90 -> 82 [weight=27];
  90 -> 92 [weight=9];
  90 -> 102 [weight=43];

我需要转换为看起来像这样的格式

90 11 25

即。我只需要删除所有额外的东西,并保持数字完全按照它们的方式。

我尝试使用正则表达式,使用以下代码:

for line in filein:
    match = re.search('label=" "', line)
    if match:
        print (match.group())

但它只打印文件中'label'的所有实例。如果我尝试搜索'label=" "',则没有输出。如果我可以阅读标签,那么阅读权重将非常类似于它。

3 个答案:

答案 0 :(得分:4)

这个怎么样:

import re

file = open("file","r")                       

for line in file:                                 
    if re.search('->',line):
        print ' '.join(re.findall('[0-9]+',line))

输出:

90 11 25
90 21 23
90 31 17
90 41 12
90 51 1
90 62 50
90 72 7
90 82 27
90 92 9
90 102 43

只需重定向即可保存输出:python test.py > newfile

答案 1 :(得分:2)

您可以使用以下内容匹配所有行:

  1. (\d+) - >一个数字(反向引用)
  2. \s*->\s* - >空间 - >空间
  3. (\d+) - >另一个号码(反向引用)
  4. \s*\[weight=\" - >空格和文字[weigth =“
  5. (\d+) - >另一个号码(反向引用)
  6. \]; - >字面意思];结束比赛。
  7. 然后你有这样的编号后向引用:

    1. 第一个数字
    2. 第二个数字
    3. 第三个数字
    4. 现在,您可以使用所需的模式构建字符串。 ($ 1 $ 2 $ 3)

答案 2 :(得分:1)

要获取每行的所有数字,请将r'\d+'.findall()一起使用:

for line in filein:
    if 'label' in line:
        print 'label:',
    print ' '.join(re.findall(r'\d', line))

您想要对label行做什么并不完全清楚,但是非常简单的循环会打印出来:

label: 90 90
90 11 25
90 21 23
90 31 17