Ты так близко, но так далеко. Почему?
Ваше первое регулярное выражение…
(\w+)\s{1}(\w+)*
… недостаточно, потому что две группы захвата не учитывают пробелы между словами в первом случае или форматирование количества во втором case.
Ваше второе регулярное выражение…
(.*?)[ ]{2,}(.*?)[ ]{2,}(.*?)[ ]{2,}(.*)
… лучше, потому что оно эффективно захватывает группы слов, даже с нетерпением.
Примечания:
- Вам не нужны группы захвата вокруг начального и конечного пробелов.
- Вам не нужны скобки вокруг символа пробела. Скобка обозначает набор символов, но в наборе есть только один символ.
Если вы слегка измените его, удалив ненужные группы захвата…
.*? {2,}(.*?) {2,}(.*?) {2,}.*
… вы можете видеть, что он захватывает значения в «Заметках» и «2019», но также агрессивно захватывает нежелательный текст.
Вы можете анализировать эти совпадения и отбрасывать ненужные с помощью Python код. Вам не нужно регулярное выражение, но вы можете быть более точным с ним.
Ваше регулярное выражение захватывает ненужные данные, потому что вы без необходимости сопоставляете любой символ с .*?
, когда вы действительно хотите ограничить совпадения следующими значениями:
- группа слов (каждое разделенное одним пробелом)
- количество, представленное строкой чисел которые могут содержать запятые и могут быть заключены в скобки
Только те строки, которые вас интересуют, на самом деле следуют этой схеме. *
View @ Regex101.com
Приведенное выше регулярное выражение улучшает сопоставление с образцом следующими способами:
- Явно соответствует началу строки
^
и конец строки $
для предотвращения сопоставления нескольких строк. - Используйте группу без захвата, чтобы сопоставить одно или несколько слов, за которыми следует один пробел:
(?:\S+ )+
- Соответствие без пробельные символы с
\S
до захватить «слова» и пунктуация (например, :
). - Выборочно сопоставлять только комбинацию из одной или нескольких цифр и запятых, необязательно заключенных в скобки, с
\(?[0-9,]+\)?
Но даже это возвращает нежелательные заголовки столбцов «Примечания» и «2019». Вы можете использовать отрицательный прогноз… (?!Notes)
… для предотвращения сопоставления строки, содержащей «Примечания».
Окончательное решение:
^ *((?:<b>(?!Notes)</b>\S+ )+) {2,}((?[0-9,]+)?).*$
Просмотр @ Regex101.com Вы можете найти его полезным для просмотра в виде синтаксической диаграммы:
View @ RegExper.com