从文本文件中提取数字(不包括日期)

时间:2018-09-10 19:00:53

标签: python regex

我有一个简单的代码,可从文本文件中提取数字,如下所示:

import re
codata = []
with open(r"filename.txt") as file:
    for line in file:
        for i in re.findall(r'\d+(?:\.\d+)?', line):
            codata.append(i)

该文本包含很多财务数据以及很多我不想要的日期。有没有简单的方法可以修改代码以排除日期?日期通常遵循以下格式(我使用特定日期作为格式的示例,但可以是任何日期):

August 31, 2018
8/31/2018
8/31/18
August 2018
FY2018
CY2018
fiscal year 2018
calendar year 2018

编辑/说明: 感谢所有人的回应和不清楚的歉意。这是一个例子: 我有一个包含以下文本的文本文件:

“出于本节中所述财务分析的目的,术语“隐含合并对价”是指交易中规定的每股对价隐含价值80.38美元,其中包括对价的现金部分20.25美元和基于XXX在2018年7月14日的收盘价每股218.67美元得出的对价0.275股XXX普通股对价的股票部分的隐含价值。”

运行上面发布的代码时,我从print(codata)获得以下输出: ['80 .38','20 .25','0.275','218.67','14','2018']

我想获得以下输出: ['80 .38','20 .25','0.275','218.67']

因此,我不想提取与日期“ 2018年7月14日”关联的数字14和2018。如果我知道与文本中的日期相关的任何数字都将具有我上面概述的格式,那么我应该如何修改代码以获得所需的输出?

3 个答案:

答案 0 :(得分:0)

很难确切地了解您想要什么。但是,如果您只是在寻找数字,则可以执行此操作(并且如果有小数,请改用float)。

import re
codata = []
with open(r"filename.txt") as file:
    for line in file:
        for i in re.findall(r'\d+(?:\.\d+)?', line):
            try:
                codata.append(int(i))
            except:
                continue

答案 1 :(得分:0)

以下是一个正则表达式,它将匹配并删除您当前的日期集:

import re

p = r"(((january|february|march|april|may|june|july|august|september|october|november|december) +[\d, ]+)|" + \
    r"((\d?\d\/){2}(\d\d){1,2})|" + r"((fiscal year|fy|calendar year|cy) *(\d\d){1,2}))"
codata = []

with open(r"filename.txt") as file:
    for line in file:
        codata.append(re.sub(p, "", line, flags=re.IGNORECASE))

print(codata)

输出(假设输入文件与您提供的日期列表相同)

['\n', '\n', '\n', '\n', '\n', '\n', '\n', '\n']

答案 2 :(得分:0)

考虑到文本示例,我假设每个价格都以$符号开头,在这种情况下,您可能正在寻找以下正则表达式:

r"(?<=\$)\d+\.?\d*(?= )"

结果将是:

['80.38', '20.25', '218.67']

如果要在列表中使用$号,则正则表达式为:

r"\$\d+\.?\d*(?= )"

以及在这种情况下的结果:

['$80.38', '$20.25', '$218.67']

为澄清起见,(?<= \ $)意味着我们的匹配需要以$符号开头,但是$符号不会添加到输出中。 (?=)表示价格后应跟空格。