我有一个简单的代码从文本文件中提取数字,它看起来像这样:
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。如果我知道与文本中的日期相关的任何数字都具有我在上面概述的格式,那么我应该如何修改我的代码以获得所需的输出?
很难理解你想要什么。但是如果你只是在寻找数字,你可以这样做(如果它有一个小数,则使用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
这是一个匹配并删除当前日期集的正则表达式:
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']
考虑到文本样本,我假设每个价格都以$符号开头,在这种情况下,您可能正在寻找以下正则表达式:
r"(?<=\$)\d+\.?\d*(?= )"
结果将是:
['80.38', '20.25', '218.67']
或者如果你想要列表中的$符号,那么正则表达式将是:
r"\$\d+\.?\d*(?= )"
以及那种情况下的结果:
['$80.38', '$20.25', '$218.67']
为了澄清,(?<= \ $)表示我们的匹配需要由$符号继续,但$符号不会添加到输出中。 (?=)表示价格应该跟空格一致。