Вы можете использовать следующее регулярное выражение с флагами /gmi
.
^Company\s+Rent\r?\n------*\s+-*\r?\n([a-z]+(?: [a-z]+)*).*\r?\n(?:([a-z]+(?: [a-z]+)*).*\r?\n)?(\d+)\s*\r?\n([a-z]+(?: [a-z]+)*).*\r?\n(?:([a-z]+(?: [a-z]+)*).*\r?\n)?(\d+)
Python демо
Это регулярное выражение имеет шесть групп захвата:
- Название компании, строка 1
- Название компании, строка 2 (необязательно)
- Numeri c идентификатор, следующий за названием компании
- Название группы, строка 1
- Имя группы, строка 2 (необязательно)
- Нумер c идентификатор, следующий за именем группы
Если название компании (группы) находится только в одной строке, группа захвата 2 (5) будет nil
. Если название компании всегда в двух строках, а имя группы всегда в одной строке, как в примере, регулярное выражение может быть соответственно упрощено. Если название компании или группы может занимать более двух строк, регулярное выражение должно быть изменено соответствующим образом.
Это регулярное выражение выполняет следующие операции.
^
Company\s+Rent\r?\n # match line
------*\s+-*\r?\n # match line
( # begin cap grp 1 (company name 1)
[a-z]+ # match 1+ ltrs
(?: [a-z]+) # match 1 space, 1+ ltrs in non-cap grp
* # execute non-cap grp 0+ times
) # end cap grp 1
.*\r?\n # match remainder of line
(?: # begin non-cap grp
( # begin cap grp 2 (opt. company name 2)
[a-z]+ # match 1+ ltrs
(?: [a-z]+) # match 1 space, 1+ ltrs in non-cap grp
* # execute non-cap grp 0+ times
) # end cap grp 2
.*\r?\n # match remainder of line
) # end non-cap group
? # optionally match non-cap grp
(\d+) # match 1+ digits in cap grp 3 (company id)
\s*\r?\n # match remainder of line
( # begin cap grp 4 (group name 1)
[a-z]+ # match 1+ ltrs
(?: [a-z]+) # match 1 space, 1+ ltrs in non-cap grp
* # execute non-cap grp 0+ times
) # end cap grp 4
.*\r?\n # match remainder of line
(?: # begin non-cap grp
( # begin cap grp 5 (opt. group name 2)
[a-z]+ # match 1+ ltrs
(?: [a-z]+) # match 1 space, 1+ ltrs in non-cap grp
* # execute non-cap grp 0+ times
) # end cap grp 5
.*\r?\n # match remainder of line
) # end non-cap grp
? # optionally match non-cap grp
(\d+) # match 1+ digits in cap grp 6 (group id)
Я понимаю, что механизм регулярных выражений Python не поддерживает подпрограммы. К сожалению, использование подпрограмм значительно упростило бы регулярное выражение. Механизм PCRE (PHP) позволяет, например, заменять каждый экземпляр после первого из ([a-z]+(?: [a-z]+))
на ((?1))
.