Ваше выражение работает отлично:
((generate|send)\s+)?((health|body)\s+)?((report)\s+)?((for)\s+)?((?P<Month>this|current|last|previous)\s+)?(month\b.*)
и переменная месяц this
входит в группу захвата 9.
Тест
import re
expression = r'((generate|send)\s+)?((health|body)\s+)?((report)\s+)?((for)\s+)?((?P<Month>this|current|last|previous)\s+)?(month\b.*)'
string = '''
generate health report for this month
send body report for this month
generate health report for this month
send body report for this month
'''
print(re.findall(expression, string))
Вывод
[('генерировать', 'генерировать', 'здоровье', 'здоровье', 'отчет', 'отчет','for', 'for', 'this', 'this', 'month'), ('send', 'send', 'body', 'body', 'report', 'report', 'for',«для», «это», «это», «месяц»), («генерировать», «генерировать», «здоровье», «здоровье», «отчет», «отчет», «для», «для»,'this', 'this', 'month'), ('send', 'send', 'body', 'body', 'report', 'report', 'for', 'for', 'this','this', 'month')]
Группа захвата 9
import re
expression = r'((generate|send)\s+)?((health|body)\s+)?((report)\s+)?((for)\s+)?((?P<Month>this|current|last|previous)\s+)?(month\b.*)'
string = '''
generate health report for this month
send body report for this month
generate health report for this month
send body report for this month
'''
matches = re.findall(expression, string)
for match in matches:
print(match[9])
Выход
this
this
this
this
Имя группы (?P<Month>)
:
import re
expression = r'((generate|send)\s+)?((health|body)\s+)?((report)\s+)?((for)\s+)?((?P<Month>this|current|last|previous)\s+)?(month\b.*)'
string = 'generate health report for this month'
match = re.search(expression, string)
print(match.group('Month'))
Вывод
this
Если вы хотите упростить / изменить / изучить выражение, это было объяснено на верхней правой панели regex101.com . При желании вы также можете посмотреть в эту ссылку , как она будет сопоставляться с некоторыми примерами входных данных.
RegEx Circuit
jex.im визуализирует регулярные выражения: