Использование регулярных выражений для анализа финансовой отчетности - PullRequest
0 голосов
/ 08 декабря 2018

Я работаю над запросом регулярного выражения, чтобы вернуть тексты определенного шаблона в группы.Вот регулярное выражение, которое я использовал: 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 имеют проблемы с ними.Как я могу настроить вышеупомянутый запрос так, чтобы он учитывал все упомянутые случаи?Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 08 декабря 2018

Вы можете попробовать этот помощник

^([a-z, \(\)-]*?)?\(?([\d,]+)?\)?\s*?\(?([\d,-]+)?\)?$

Объяснение

  • ^ - Привязка к началу строки.
  • ([a-z, \(\)-]+?)? - Соответствует любому символу от a до z, или ,, или (, или ') `, или' - 'ноль или более времени (ленивый режим).
  • \(?- Соответствует ( (? делает его необязательным).
  • ([\ d,] +)?- Соответствует любой цифре или , один или несколько раз. (? делает это необязательным).
  • \) - Соответствует ).
  • \s*? - Соответствует пробелуили больше времени.
  • (?([\d,-]+)?\)? - соответствует любой цифре или -.
  • $ - конец строки.

Demo

0 голосов
/ 08 декабря 2018

Я думаю, что это регулярное выражение будет делать то, что вы хотите:

^([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

0 голосов
/ 08 декабря 2018

Попробуйте ниже регулярное выражение

r"([\w ,()-]*)[\(?[\d, -]*\)?]*[\(?[\d, -]*\)?]*"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...