Нужна помощь в отношении регулярных выражений, чтобы найти слово из конкретного предложения для Python - PullRequest
0 голосов
/ 12 октября 2019

Python не может правильно определить следующее регулярное выражение. Там должно быть какая-то ошибка в следующем регулярном выражении. Проверка на Pythex показывает, что все в порядке. Но Python не делает.

my regex = "((generate|send) )?((health|body) )?((report) )?((for) )?((?P<Month>this|current|last|previous) )?(month.*)"
examle_string_1 = "generate health report for this month"
examle_string_2 = "send body report for this month"

Я хочу переменную, month = "this" из строки.

1 Ответ

1 голос
/ 12 октября 2019

Ваше выражение работает отлично:

((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 визуализирует регулярные выражения:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...