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

使用Python在文件中查找字符串并在同一行上提取整数值,python,python-2.6,Python,Python 2.6,我是python新手,有以下问题 我有一个文本文件(filename.dat),它提供关于我的模型的信息。相关部分概述如下: NUMBER OF ELEMENTS IS 1367466 NUMBER OF NODES IS 252624 NUMBER OF NODES DEFINED BY THE USER

我是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"

但是,我不确定如何在“元素数为”的同一行提取整数值(1367466)。现在有人知道如何从混合了字符串的行中提取字符串数字了吗?

一种方法是使用并获取最后一个元素:

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

把它转换成int,你就有了一个数字。然而,如果你的电话号码不是最后一条线,这就行不通了。买主须知。

一种方法是使用拆分:

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()]
()如果字符串中的所有字符都是数字且至少有一个字符,则返回true,否则返回false<代码>行。拆分将行拆分为单词,因此对于您的示例,您将得到
['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)

将行从右侧按空格拆分一次:

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:
        if 'NUMBER OF ELEMENTS IS' in line:
            print "true"
            label, number = line.rsplit(None, 1)   # label is unused then
            number = int(number)
            ...

您可以使用正则表达式

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
函数(如最后一行所示)访问匹配的这一部分。

我也会选择正则表达式

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()
这将为您提供一个包含字符串和数字的列表

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()