Регулярное выражение для захвата группы слов, за которой следует группа отформатированных величин - PullRequest
0 голосов
/ 18 марта 2020

Учитывая содержимое текстового файла (ниже), я хочу извлечь два значения из каждой строки, имеющей следующий шаблон - группы захвата, обозначенные [#] :

  1. Неизвестное количество начальных пробелов…
  2. [1] группа слов (каждое разделено одним пробелом)…
  3. два или более пробелов…
  4. [2] количество, представленное строкой чисел, которая может содержать запятые и может быть заключена в скобки…
  5. два или более пробелов…
  6. количество, следующее за тем же шаблоном, что и прежнее
  7. неизвестное количество пробельных пробелов.

Цель чтобы получить значения в столбцах «Примечания» и «2019» в тексте и поместить их в словарь Python.

Я пытался использовать следующие регулярные выражения:

(\w+)\s{1}(\w+)*

(.*?)[ ]{2,}(.*?)[ ]{2,}(.*?)[ ]{2,}(.*)

Пример текстового файла:

                                                    Micro-entity Balance Sheet as at 31 May 2019                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
                                                                                                                  Notes            2019           2018                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
                                                                                                                                         £              £                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
                         Fixed Assets                                                                                             2,046          1,369                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
                         Current Assets                                                                                         53,790         24,799                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
                         Creditors: amounts falling due within one year                                                        (23,146)        (6,106)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
                         Net current assets (liabilities)                                                                       30,644          18,693                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
                         Total assets less current liabilities                                                                  32,690         20,062                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
                         Total net assets (liabilities)                                                                         32,690         20,062                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
                         Capital and reserves                                                                                   32,690         20,062                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
                 For the year ending 31 May 2019 the company was entities to exemption under section 477 of the                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
                 Companies Act 2006 relating to small companies                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
           ®     The members have not required the company to obtain an audit in accordance with section 476 of                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
                 the Companies Act 2006.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
           ®     The director acknowledge their responsibilities for complying with the requirements of the                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
                 Companies Act 2006 with respect to accounting                               records and the preparation of accounts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
           ®     The accounts         have been prepared in accordance with the micro-entity provisions and delivered in                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
                 accordance with the provisions applicable to companies subject to the small companies regime.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
       Approved by the Board on 20 December 2019                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
       And signed on their behalf by:                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
       Director                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
       This document was delivered using electronic communications and authenticated in accordance with the                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
       registrar's rules relating to electronic form, authentication and manner of delivery under section 1072 of                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
       the Companies Act 2006.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    

Экзамен Допустимые совпадения:

"Fixed Assets", "2,046"
"Current Assets", "53,790"
"Creditors: amounts falling due within one year", "(23,146)"
"Net current assets (liabilities)", "30,644"
"Total assets less current liabilities", "32,690"
"Total net assets (liabilities)", "32,690"
"Capital and reserves", "32,690"

1 Ответ

0 голосов
/ 18 марта 2020

Ты так близко, но так далеко. Почему?

Ваше первое регулярное выражение…

(\w+)\s{1}(\w+)*

… недостаточно, потому что две группы захвата не учитывают пробелы между словами в первом случае или форматирование количества во втором case.

Ваше второе регулярное выражение…

(.*?)[ ]{2,}(.*?)[ ]{2,}(.*?)[ ]{2,}(.*)

… лучше, потому что оно эффективно захватывает группы слов, даже с нетерпением.

Примечания:

  1. Вам не нужны группы захвата вокруг начального и конечного пробелов.
  2. Вам не нужны скобки вокруг символа пробела. Скобка обозначает набор символов, но в наборе есть только один символ.

Если вы слегка измените его, удалив ненужные группы захвата…

.*? {2,}(.*?) {2,}(.*?) {2,}.*

… вы можете видеть, что он захватывает значения в «Заметках» и «2019», но также агрессивно захватывает нежелательный текст.

Вы можете анализировать эти совпадения и отбрасывать ненужные с помощью Python код. Вам не нужно регулярное выражение, но вы можете быть более точным с ним.

Ваше регулярное выражение захватывает ненужные данные, потому что вы без необходимости сопоставляете любой символ с .*?, когда вы действительно хотите ограничить совпадения следующими значениями:

  1. группа слов (каждое разделенное одним пробелом)
  2. количество, представленное строкой чисел которые могут содержать запятые и могут быть заключены в скобки

Только те строки, которые вас интересуют, на самом деле следуют этой схеме. *

View @ Regex101.com

Приведенное выше регулярное выражение улучшает сопоставление с образцом следующими способами:

  1. Явно соответствует началу строки ^ и конец строки $ для предотвращения сопоставления нескольких строк.
  2. Используйте группу без захвата, чтобы сопоставить одно или несколько слов, за которыми следует один пробел: (?:\S+ )+
  3. Соответствие без пробельные символы с \S до захватить «слова» и пунктуация (например, :).
  4. Выборочно сопоставлять только комбинацию из одной или нескольких цифр и запятых, необязательно заключенных в скобки, с \(?[0-9,]+\)?

Но даже это возвращает нежелательные заголовки столбцов «Примечания» и «2019». Вы можете использовать отрицательный прогноз… (?!Notes)… для предотвращения сопоставления строки, содержащей «Примечания».

Окончательное решение:

^ *((?:<b>(?!Notes)</b>\S+ )+) {2,}((?[0-9,]+)?).*$
Просмотр @ Regex101.com

Вы можете найти его полезным для просмотра в виде синтаксической диаграммы: A regular expression syntax diagram of the suggested final solution View @ RegExper.com

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...