使用正则表达式读取会计信息
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})
捕获 组 3,credit$ 的货币格式
\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。
上下文
在我的日常工作中,我浪费了很多时间将天平 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})
捕获 组 3,credit$ 的货币格式
\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。