Skip to main content
 首页 » 编程设计

python之使用正则表达式解析财务报表

2024年12月31日26thcjp

我正在处理正则表达式查询,以将特定模式的文本返回到组中。这是我使用的正则表达式: r"([\w+\-?\w+]* [\w+ ]+ [\(?\w+\)?]*) (\(?[\d ,-]+\)?) (\(?[\d,-]+\)?)"。以下是我正在解析的示例行以及我希望输出的内容:

1) String: LOSS BEFORE INCOME TAXES (900,000) (900,000) 
Desired output: [('LOSS BEFORE INCOME TAXES', '(900,000)', '(900,000)')] 
Final result: correct  
 
2) String: INCOME TAXES (RECOVERED) (90,000) (90,000) 
Desired output: [('INCOME TAXES (RECOVERED)', '(90,000)', '(90,000)')] 
Final result: correct 
 
3) String: RETAINED EARNINGS - BEGINNING OF YEAR 9,999,999 9,999,999 
Desired output: [('RETAINED EARNINGS - BEGINNING OF YEAR', '9,999,999', '9,999,999')] 
Final result: correct 
 
4) String: EXPENSES 
Desired output: ['EXPENSES'] 
Final result: correct 
 
5) String: Subcontracts 8,058 2,655 
Desired output: [('Subcontracts', '8,000,000')] 
Final result: ['Subcontracts 8', '', '058 2', '', '655', ''] 
 
6) String: Business taxes 116 - 
Desired output: [('Business taxes', '116', '-')] 
Final result: ['Business taxes 116 ', '', ''] 
 
7) String: 600,000 600,000 
Desired output: [(600,000), (600,000)] 
Final result: ['642', '', '437 629', '', '070', ''] 
 
8) String: Salaries, wages and benefits 400,000 400,000 
Desired output: [('Salaries, wages and benefits', '400,000', '400,000')] 
Final result: [(' wages and benefits', '463,437', '466,742')] 

我不确定自己做错了什么或遗漏了什么,但是 5、6、7 和 8 有问题。我怎样才能调整上面的查询,以便它解释所有提到的情况?提前致谢!

请您参考如下方法:

我认为这个正则表达式会做你想做的事:

^([A-Z][A-Za-z0-9 (),%;-]+?[^(\d\s])? ?(?:(\(?[\d,]+\)?|-)\s+(\(?[\d,]+\)?|-))?$ 

它查找一组字母字符,以字母开头,可能包括一些 [(),%;-],但不以 (,数字或空格,后跟两组可能被 () 包围的数字和 , 或 -。所有组都是可选的以允许匹配行没有描述或没有数字。

在 Python 中:

import re 
data = """LOSS BEFORE INCOME TAXES (900,000) (900,000) 
INCOME TAXES (RECOVERED) (90,000) (90,000) 
RETAINED EARNINGS - BEGINNING OF YEAR 9,999,999 9,999,999 
EXPENSES 
Subcontracts 8,058 2,655 
Business taxes 116 - 
600,000 600,000 
GROSS PROFIT (50%; 2016 - 50%) 500,000 500,000 
Bad debts - 50 
Salaries, wages and benefits 400,000 400,000""" 
regex = re.compile('^([A-Z][A-Za-z0-9 (),%;-]+?[^(\d\s])? ?(?:(\(?[\d,]+\)?|-)\s+(\(?[\d,]+\)?|-))?$', re.MULTILINE) 
print regex.findall(data) 

输出:

[('LOSS BEFORE INCOME TAXES', '(900,000)', '(900,000)'), 
 ('INCOME TAXES (RECOVERED)', '(90,000)', '(90,000)'), 
 ('RETAINED EARNINGS - BEGINNING OF YEAR', '9,999,999', '9,999,999'), 
 ('EXPENSES', '', ''), 
 ('Subcontracts', '8,058', '2,655'), 
 ('Business taxes', '116', '-'), 
 ('', '600,000', '600,000'), 
 ('GROSS PROFIT (50%; 2016 - 50%)', '500,000', '500,000'), 
 ('Bad debts', '-', '50'), 
 ('Salaries, wages and benefits', '400,000', '400,000') 
] 

Demo on rextester