Вы можете сопоставить следующее регулярное выражение, а затем извлечь содержимое трех групп захвата:
r'^(>CP\d{6}\.\d).+?\bproduct +length += +(\d+).*?^Template +(\d+).*?^Template +(\d+)'gms
Демо
Это можно сделать самодокументированием, используя Флаг Python VERBOSE (он же X
).
Он получен из Perl свободного пробела , который я использовать, потому что я не знаком с Python. Читатель, который не знает Perl, сможет отлично это понять.
/
^ # match beginning of line
(>CP\d{6}\.\d) # match '>CP', 6 digits, '.', 1 digit in cap group 1
.+? # match 0+ characters, lazily (`?`)
\b # match a word break
product\ +length\ +=\ + # match 'product', 1+ spaces, 'length', 1+ spaces,
# '=', 1+ spaces
(\d+) # match 1+ digits in cap group 2
.*? # match 0+ characters, lazily (`?`)
^Template\ + # match beginning of line, 'Template', 1+ spaces
(\d+) # match 1+ digits in cap group 3
.*? # match 0+ characters, lazily (`?`)
^Template\ + # match beginning of line, 'Template', 1+ spaces
(\d+) # match 1+ digits in cap group 4
/xgms # free-spacing, global, multiline, single-line modes
Значения различных режимов приведены по ссылке. В режиме свободного пробела неэкранированные пробелы вне классов символов удаляются перед анализом регулярного выражения. Поэтому пробелы, являющиеся частью выражения, например, между «product» и «length», должны быть защищены. Я решил избежать их здесь, но другие варианты заключаются в том, чтобы поместить каждый пробел в символьный класс ([ ]
), использовать выражения Unicode \p{Space}
или [[:space:\\
или, если необходимо, \s
(символ пробела).