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

2024-09-24 02:18:15 发布

您现在位置:Python中文网/ 问答频道 /正文

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

//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];

我需要转换成这样的格式

^{pr2}$

也就是说,我只需要去掉所有多余的东西,把号码保持原样。在

我尝试使用regex,代码如下:

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

但它只打印文件中'label'的所有实例。如果我试图搜索'label=" "',则没有输出。如果我能知道怎么读标签的话,那么读重量就和它很相似了。在


Tags: 文件代码for格式matchlinelabelregex
3条回答

这个怎么样:

import re

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

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

输出:

^{pr2}$

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

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

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

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

^{pr2}$

等等

您可以将所有行与以下内容匹配:

  1. (\d+)->;一个数字(反向引用)
  2. \s*->\s*->;空格->;空格
  3. (\d+)->;另一个号码(反向引用)
  4. \s*\[weight=\"->;空格和文本[weigth=”
  5. (\d+)->;另一个号码(反向引用)
  6. \];->;Literal];结束匹配。在

然后你有一个编号的反向引用,如下所示:

  1. 第一个号码
  2. 第二个号码
  3. 第三个号码

现在可以使用所需的模式构建字符串。(1美元2美元3美元)

相关问题 更多 >