3

我是 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)。现在有谁如何从与字符串字符混合的行中提取字符串数字?

4

5 回答 5

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)
            ...
于 2013-04-02T23:58:39.097 回答
0

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

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

将其转换为 int 并且您有一个数字。但是,如果您的号码不是最后一行,这将不起作用。买者自负。

于 2013-04-02T23:58:09.743 回答
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)
于 2013-04-02T23:58:15.647 回答
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函数访问匹配的这一部分(如最后一行中的示例)。

于 2013-04-03T00:06:22.830 回答
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()

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

于 2014-03-01T22:05:25.970 回答