使用REGEX读取财务报表

2024-05-13 09:23:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在做一个项目,我必须阅读财务报表的扫描图像。我使用tesseract 4将图像转换为文本输出,如下所示(以下是一个片段):

收入90000000900000

销售成本900000 900000

毛利润(90%;2016-90%)900000 900000

我想把上面的内容分成三个条目,第一个条目是文本,第二个条目和第三个条目是数字。例如,第一行如下所示:

[[REVENUE], [9,000,000], [9,000,000]]

我遇到了这个堆栈溢出帖子,其中有人试图使用re.match()到{}方法来找到模式:How to split strings into text and number?

我刚刚被介绍给regex,我正在努力正确理解语法和文档。我现在正试着用备忘单,但我很难弄清楚该怎么做,请帮忙。在


Tags: 项目方法图像文本re内容堆栈match
3条回答

检测字符串

rev_str = "[[REVENUE], [9,000,000], [9,000,000]]"

并提取值

^{pr2}$

你会的

import re
x = re.match(r"\[\[([A-Z]+)\], \[([0-9,]+)\], \[([0-9,]+)\]\]", rev_str)
x.groups()
# ('REVENUE', '9,000,000', '9,000,000')

让我们解开这根大绳子。在

  • 方括号表示字符范围。例如,[A-Z]表示查找从A到{}的所有字母,而{}表示查找从0到{}的数字,以及字符,。这里的-是一个在方括号内用来表示我们想要的字符范围的运算符。在
  • +运算符意味着查找紧跟在它前面的任何事物的至少一个事件。例如,表达式[A-Z]+表示查找AZ中的任何一个。您还可以使用*运算符来查找前面任何内容的至少零次。在
  • 圆括号(即圆括号)表示要从正则表达式中提取的。无论何时匹配该模式,括号中任何表达式中的内容都将被提取并作为一个组返回。例如,([A-Z+])表示查找A到{}中的任何一个字母,然后保存结果为的任何字母。在将regex匹配的结果分配给变量x之后,我们通过执行x.groups()来访问它。在
  • 否则,对于模式[[TEXT], [NUMBER], [NUMBER]],它是直接适应的。方括号是用\字符转义的,因为我们希望将它们从字面上解释为而不是字符范围。在
  • 总之,re.match()函数将在rev_str中搜索给定模式与匹配的任何位置,跟踪匹配中的,并在调用x.groups()时返回这些组。在

这是一个相当简单的例子,但你必须从某个地方开始,对吗?您应该能够使用它作为一个起点,来创建一个更复杂的regex表达式来处理更多的代码。在

正如您所说的,regex对于这个问题来说太过了。在

最后两个项目之前的text.split()join更适合于此。在

lines = [ "REVENUE 9,000,000 900,000",
          "COST OF SALES 900,000 900,000",
          "GROSS PROFIT (90%; 2016 - 90%) 900,000 900,000" ]
out = []
for line in lines:
    parts = line.split()
    if len(parts) < 3:
        raise InputError
    if len(parts) == 3:
        out.append(parts)
    else:
        out.append([' '.join(parts[0:len(parts)-2]), parts[-2], parts[-1]])

out将包含

^{pr2}$

如果标签文本需要进一步提取,您可以使用regex,或者您可以简单地查看parts[0:len(parts)-2]中的项并根据其中的单词和数字进行处理。在

我通过观察您的第一个预期输出编写了这个regex。但我不确定你对第三句话的期望输出是什么。在

  1. ([A-Za-z ]+)(?=\d|\S)匹配名称,直到找到一个数字或符号。在
  2. .*?对于我们不关心的字符串
  3. ([\d,]+)\s([\d,]+|(?=-\n|-$))匹配一组或两组数字,如果只有一组数字,则该组应以换行符或文本结尾结尾。在

测试代码(已编辑):

import re

regex = r"([A-Za-z ]+)(?=\d|\S).*?([\d,]+)\s([\d,]+|(?=-\n|-$))"

text = """
REVENUE 9,000,000 900,000

COST OF SALES 900,000 900,000

GROSS PROFIT (90%; 2016 - 90%) 900,000 900,000

Business taxes 999 -
"""

print(re.findall(regex,text))
# [('REVENUE ', '9,000,000', '900,000'), ('COST OF SALES ', '900,000', '900,000'), ('GROSS PROFIT ', '900,000', '900,000'), ('Business taxes ', '999', '')]

相关问题 更多 >