Я думаю, что это регулярное выражение будет делать то, что вы хотите:
^([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')
]
Демонстрация на rextester