Regex для ингредиентов рецепта - игнорирование прилагательных и посторонних слов - PullRequest
2 голосов
/ 10 января 2020

Я работал над регулярным выражением для разбора списков рецептов из различных онлайн-источников, и у меня были проблемы с тем, чтобы регулярное выражение игнорировало прилагательные и квалификаторы в рецептах.

Например, если рецепт требует "1 паприка с округленной столовой ложкой", я хочу, чтобы мое регулярное выражение игнорировало "округлено" и возвращало "1", "столовая ложка" и "паприка". С этой целью я придумал:

(\d\/?\d?) ([\w]+?)?? ?(cup|tablespoon|teaspoon)? ([\w\s]+)

, который, кажется, работает хорошо, пока есть измерение. Но для чего-то вроде «1 яйцо» или «2 зеленых луков» это не совпадает.

Есть ли способ сделать регулярное выражение не только совпадающим, когда нет измерения, но и поместить ингредиент (т.е. «яйцо») в ту же группу (группу 4), что и ингредиенты с измерением?

1 Ответ

0 голосов
/ 27 февраля 2020

Лучше включать пробелы также в скобки, тогда они сопоставляются только вместе. Дает вам два совпадения для «округленных»: с пробелом и без него после него, поэтому просто используйте второй:

>>> re.findall("(\d\/?\d?) (([\w]+?) )?((cup|tablespoon|teaspoon) )?([\w\s]+)", "1 rounded tablespoon paprika")
[('1', 'rounded ', 'rounded', 'tablespoon ', 'tablespoon', 'paprika')]

>>> re.findall("(\d\/?\d?) (([\w]+?) )?((cup|tablespoon|teaspoon) )?([\w\s]+)", "1 tablespoon paprika")
[('1', 'tablespoon ', 'tablespoon', '', '', 'paprika')]

>>> re.findall("(\d\/?\d?) (([\w]+?) )?((cup|tablespoon|teaspoon) )?([\w\s]+)", "1 egg")
[('1', '', '', '', '', 'egg')]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...