使用正则表达式读取会计信息

Reading accounting information with regex

上下文

在我的日常工作中,我浪费了很多时间将天平 sheet 中的值手动输入 excel,所以我开始学习如何在 python 中编码以加快我的速度工作。

问题

我正在尝试创建一个正则表达式,它能够检测一个帐户的价值并将该帐户拥有的钱发送给我。问题是有多个软件,因此正则表达式变得非常复杂。

会计软件的不同输出示例

如您所见,总有一种模式:一个帐户名,它是一个可以包含多个 space 和特殊字符的字符串; 一列信用和债务的值,带有逗号和,

账号可以有逗号也可以没有

示例 1

Random number Account number Account Name credit$ Debt$ Value of account
10 53 Another Financial Instruments 1.100,00 1.500,00 400,00 D
531 Café C/C (Taxes) 100,00 50,00 50,00 C
230 5321 Example 100,00 50,00 50,00 C
54 Example 2 300,00 500,00 200,00 D

这是最复杂的输出,因为他们在帐号后面放了一个随机数,所以在随机数和帐号之间有双 space 的帐号,而其他帐号则没有任何 space

10 __ 53 -> space 54 -> 没有 space 因为没有随机数 账户的列值也等于 Credit - Debt 如果 credit > Debt 他们有一个 C 进入价值,否则他们有一个 D

示例 2

Account number Account Name credit$ Debt$ Value of account
5.3 Another Financial Instruments 1.100,00 1.500,00 400,00
5.3.1 Café C/C (Taxes) 100,00 50,00 50,00
5.3.2.1 Example 100,00 50,00 50,00
5.4 Example 2 300,00 500,00 200,00

在这个例子中,账户的值中没有随机数或D或C,但账户号码中有一个逗号。

示例 3

Account number Account Name credit$ Debt$
53 Another Financial Instruments 1.100,00 1.500,00
531 Café C/C (Taxes) 100,00 50,00
5321 Example 100,00 50,00
54 Example 2 300,00 500,00

这是最简单的一个,帐号中没有逗号,没有随机数,但是没有账户价值列,所以会计总是需要同时插入债务和贷方价值并计算差额。

我的新手正则表达式仅适用于第一个示例(\d{2,4}\s) (\w+(\s+\w+)+(\s+\w+)*) (\s\d,\d\d\s)它不适用于所有值。

最终目标是将 python 的输出导出到 excel 并对帐号和值进行 PROCV 以进行一些分析。

我试图将 pdf 转换为 excel 或 word,但它被损坏了。

更新:

例1现实生活中的例子:

在我上面的示例中,我没有提到比您拥有当年的债务和信贷以及最终价值多 3 列的月度债务和信贷以及它们之间的差异。我没有提到简化示例。

真实的生活是葡萄牙语的名字。

12 DEPÓSITOS À ORDEM 55.884,44 42.165,87 750.656,46 427.920,52 322.735,94 D

2 121 Banco BPI, Sa 55.884,44 42.152,35 750.503,75 427.792,60 322.711,15 D

2 122 Novo Banco s a 0,00 13,52 152,71 127,92 24,79 D

13 OUTROS DEPÓSITOS BANCÁRIOS 0,00 0,00 87.277,22 0,00 87.277,22 D

131 普拉唑存款 0,00 0,00 87.277,22 0,00 87.277,22 D

示例 3

例子3只有当月的债权和当年的债权

12 订单存款 4.237.864,32 3.524.858,99 713.005,33 0,00

13 Outros depósitos bancários 400.000,00 0,00 400.000,00 0,00

14 Outros Instrumentos financeiros 49.992,28 0,00 49.992,28 0,00

33 Matérias-primas, subsidiárias e de consumo 1.721.079,97 843.549,38 877.530,59 0,00

-- 谢谢大家的评论!

对于示例数据,您可以使用捕获组的方法,对于 Value of account 在模式末尾创建一个可选组。

如果你有更多列,你可以扩展模式。

使用代码时,可以检查最后一个可选组是否存在。

^(\d+(?:\.\d+)*)\s+(.+?)\s+(\d{1,3}(?:\.\d{3})*,\d{2})\s+(\d{1,3}(?:\.\d{3})*,\d{2})(?:\s+(\d{1,3}(?:\.\d{3})*,\d{2}(?:\s+[CD])?))?$

模式匹配:

  • ^ 字符串开头
  • (\d+(?:\.\d+)*) 捕获 组 1,匹配 1+ 位数字并可选择重复匹配 帐号[=63= 的点和 1+ 位数字]
  • \s+ 匹配 1+ 个空白字符
  • (.+?) 捕获 组 2,匹配 1+ 个字符,尽可能少地用于 帐户名
  • \s+ 匹配 1+ 个空白字符
  • (\d{1,3}(?:\.\d{3})*,\d{2}) 捕获 组 3credit$
  • 的货币格式
  • \s+ 匹配 1+ 个空白字符
  • (\d{1,3}(?:\.\d{3})*,\d{2}) 捕获 组 4债务$
  • 的货币格式
  • (?:非捕获组
    • \s+ 匹配 1+ 个空白字符
    • (\d{1,3}(?:\.\d{3})*,\d{2}(?:\s+[CD])?) 捕获 组 5账户价值 的货币格式,可选部分匹配 1+ 个空白字符和 C 或 D
  • )?关闭非捕获组并使其可选
  • $ 字符串结束

看到一个regex101 demo