使用Python在文件中查找字符串并在同一行中提取整数值

时间:2013-04-02 23:54:23

标签: python python-2.6

我是python的新手并遇到以下问题。

我有一个文本文件(filename.dat),它提供有关我的模型的信息。相关部分的摘要如下:

      NUMBER OF ELEMENTS IS                               1367466
      NUMBER OF NODES IS                                   252624
      NUMBER OF NODES DEFINED BY THE USER                  248291
      NUMBER OF INTERNAL NODES GENERATED BY THE PROGRAM      4333
      TOTAL NUMBER OF VARIABLES IN THE MODEL               783873

我可以使用以下python命令搜索该行:

with open('filename.dat', 'r') as inF:
    for line in inF:
        if 'NUMBER OF ELEMENTS IS' in line:
            print "true"

但是我不确定如何在'NUMBER OF ELEMENTS IS'的同一行提取整数值(1367466)。现在有人如何从与字符串字符混合的行中提取字符串数字吗?

5 个答案:

答案 0 :(得分:5)

用右边的空格分割线条,一次:

In [18]: line.rsplit(None, 1)
Out[18]: ['TOTAL NUMBER OF VARIABLES IN THE MODEL', '783873']

采取第二部分:

In [19]: line.rsplit(None, 1)[1]
Out[19]: '783873'

将其转换为int:

In [20]: int(line.rsplit(None, 1)[1])
Out[20]: 783873

您可以使用元组解包来使代码更清晰(如果您的整个文件都是这种格式):

with open('filename.dat', 'r') as inF:
    for line in inF:
        label, number = line.rsplit(None, 1)
        if 'NUMBER OF ELEMENTS IS' in label:
            print "true"
            number = int(number)
            ...

如果某些行的格式不同,则必须先搜索并稍后拆分:

with open('filename.dat', 'r') as inF:
    for line in inF:
        if 'NUMBER OF ELEMENTS IS' in line:
            print "true"
            label, number = line.rsplit(None, 1)   # label is unused then
            number = int(number)
            ...

答案 1 :(得分:0)

这样做的一种方法是使用str.split()并获取最后一个元素:

In [21]: line = 'NUMBER OF ELEMENTS IS                               1367466'
In [22]: line.split()[-1]
Out[22]: '1367466'

将其转换为int并且您有一个数字。但是,如果您的号码不是最后一件事,这将无效。注意事项。

答案 2 :(得分:0)

一种方法是使用拆分:

with open('filename.dat', 'r') as inF:
    for line in inF:
        if 'NUMBER OF ELEMENTS IS' in line:
            print [int(d) for d in line.split() if d.isdigit()]
如果字符串中的所有字符都是数字且至少有一个字符,则

str.isdigit()返回true,否则返回false。 line.split将该行拆分为单词,因此对于您的示例,您将获得['NUMBER', 'OF', 'ELEMENTS', 'IS', '1367466']isdigit()然后,作为过滤器来选择由所有数字组成的部分。如果你不确定数字在哪里,这可能会很方便。否则你可以抓住感兴趣的词。

另一种方法是使用正则表达式,但这对你的简单例子来说太过分了:

import re
with open('input', 'r') as inF:
    for line in inF:
            m = re.match('NUMBER OF ELEMENTS IS\s*(\d+)', line)
            if m:  
                    print m.group(1)

答案 3 :(得分:0)

您可以使用正则表达式。

text = open('filename.dat', 'r').read()

matches = re.search("NUMBER OF ELEMENTS IS\s+(\d+)", text)
if matches is not None:
    num_of_elem = matches[0].group(1)

正则表达式中的括号表示匹配表达式的子匹配,允许您稍后使用group函数访问此部分匹配(如最后一行中所示)。

答案 4 :(得分:0)

我也会选择正则表达式

import re

with open('filename', 'r') as inF:
    for line in inF:  
        match = re.match(r"([a-z]+)([0-9]+)", line)
          if match:
            items = match.groups()

那会给你一个包含字符串和数字的列表