从Python中的Text文件中提取数字数据

时间:2014-05-28 23:54:00

标签: python string extract

假设我有一个包含数据/字符串的文本文件:

Dataset #1: X/Y= 5, Z=7 has been calculated
Dataset #2: X/Y= 6, Z=8 has been calculated
Dataset #10: X/Y =7, Z=9 has been calculated 

我希望输出在csv文件中:

X/Y, X/Y, X/Y

应该显示:

5, 6, 7

这是我目前使用的方法,我使用的是string.find,但我觉得解决这个问题相当困难:

data = open('TestData.txt').read()
#index of string
counter = 1

if (data.find('X/Y=')==1):      
#extracts segment out of string
    line = data[r+6:r+14]
    r = data.find('X/Y=')
    counter += 1 
    print line
else: 
    r = data.find('X/Y')`enter code here`
    line = data[r+6:r+14]
    for x in range(0,counter):
    print line


print counter

错误:出于某种原因,我只得到5的值。当我设置#loop时,我得到无限的5。

2 个答案:

答案 0 :(得分:2)

如果您希望数字和txt文件的格式类似于前两行,即X/Y= 6,则不像X/Y =7

import re
result=[]
with open("TestData.txt") as f:
    for line in f:
        s = re.search(r'(?<=Y=\s)\d+',line) # pattern matches up to "Y" followed by "=" and a space "\s" then a digit or digits. 
        if s: # if there is a match i.e re.search does not return None, add match to the list.
            result.append(s.group())
print result
['5', '6', '7']

要匹配评论中的模式,您应该像时间一样逃避。或者你将匹配1.2 + 3之类的字符串......“。”有特殊的意义。

所以re.search(r'(?<=Counting Numbers =\s)\d\.\d\.\d',s).group() 将仅返回1.2.3

如果它更明确,您可以使用完整的s=re.search(r'(?<=X/Y=\s)\d+',line)模式X/Y=\s

使用评论和更新行中的原始行将返回:

['5', '6', '7', '5', '5']

(?<=Y=\s)被称为正面后瞻断言

(?<=...)

匹配,如果字符串中的当前位置前面有匹配的...,结束于当前位置

有很多很好的例子here in the re documentation。 parens中的项目不会被退回。

答案 1 :(得分:1)

由于实体似乎都在一行中,我建议您使用readline中的loop逐行读取文件,然后使用regex从该行解析出你正在寻找的组件。

编辑重新:OP的评论:

在这种情况下,可用于捕获给定指定格式的数字的一个正则表达式模式为:X/Y\s*=\s*(.+),