Вы можете использовать 3 группы и сделать вторую группу необязательной. Вы можете опустить re.DOTALL
и вместо совпадения 0 или более пробельных символов \s*
после сопоставления новой строки.
(Hi there:)\r?\n\s*(?:(Hello:)\r?\n\s*)?(welcome:)
Regex demo | Python demo
В коде, например, вы можете проверить, не является ли группа 2 None
import re
regex = r"(Hi there:)\r?\n\s*(?:(Hello:)\r?\n\s*)?(welcome:)"
data1 = ("Hi there:\n\n"
"Hello:\n\n"
"welcome:")
mat = re.search(regex, data1)
if mat:
print(mat.group(1))
if mat.group(2) is not None:
print(mat.group(2))
print(mat.group(3))