регулярное выражение, чтобы игнорировать все между отрицательным взглядом позади и соответствием - PullRequest
0 голосов
/ 28 января 2019

Я знаю, что почти каждый вопрос о регулярных выражениях должен быть задан и получен ответ, но здесь я иду:

Я хочу, чтобы регулярное выражение соответствовало:

"alcohol abuse"
"etoh abuse"
"alcohol dependence"
"etoh dependence"

, но не совпадало

"denies alcohol dependence"
"denies smoking and etoh dependence"
"denies [anything at all] and etoh abuse"

Отрицательный взгляд позади очевиден, но как мне НЕ сопоставить последние два примера?

Пока мое регулярное выражение выглядит так:

re.compile("(?<!denies\s)(alcohol|etoh)\s*(abuse|dependence)")

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

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

Спасибо за советы

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Если вы не можете установить какие-либо модули, вы можете переформулировать свое выражение и проверить пустоту группы 1:

import re
rx = re.compile("(denies)?.*?(alcohol|etoh)\s*(abuse|dependence)")

sentences = ["alcohol abuse", "etoh abuse", "alcohol dependence", "etoh dependence",
             "denies alcohol dependence", "denies smoking and etoh dependence", "denies [anything at all] and etoh abuse"]

def filterSentences(input):
    m = rx.search(input)
    if m and m.group(1) is None:
        print("Yup: " + sent)

for sent in sentences:
    filterSentences(sent)

Это приводит к

Yup: alcohol abuse
Yup: etoh abuse
Yup: alcohol dependence
Yup: etoh dependence

Если у вас больше denies (то есть does not like...), просто измените первую группу заголовков.

0 голосов
/ 28 января 2019

Вы можете использовать группы совпадений и использовать следующий общий шаблон:

bad|(good)

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

Таким образом, ваш шаблон будет таким (обратите внимание на все круглые скобки «только для группировки»):

denies.*?(?:(?:alcohol|etoh)\s*(?:abuse|dependence))|((?:alcohol|etoh)\s*(?:abuse|dependence))

"группа 1" в этой демонстрации regex101 содержит только допустимые совпадения.

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