У меня есть текст, в котором каждая строка текста содержит хорошие слова и некоторые плохие (нежелательные) слова. Таким образом, модель может выглядеть следующим образомМожет кто-то объяснить объяснение жадности в этом регулярном выражении
good1-good2 good3 bad1-good4-bad2 some more good words
good1-good2 good3 bad1 bad2
good1-good2 good3 bad1 bad2 bad3
Теперь я должен отвергнуть все, что в строке ниже, а также в том числе первого плохого слова Так
good1-good2 good3 bad1-good4-bad2 some more good words
должен стать good1-good2 good3
good1-good2 good3 bad1 bad2
должны стать good1-good2 good3
good1-good2 good3 bad1 bad2 bad3
должно быть good1-good2 good3
Я использую питона так это то, что я сделал
p=re.compile('([\w \d-]+) (bad1|bad2|bad3).+',re.I)
m=p.search('good1-good2 good3 bad1-good4-bad2 ')
m.group(1)
и это дает good1-good2 good3
, который является то, что я хочу, но
m=p.search('good1-good2 good3 bad1 bad2 ')
m.group(1)
возвращает good1-good2 good3 bad1
Я подумал, что, поскольку +
жаден так +
в ([\w \d-]+)
идет по совпадающим символам до конца строки, а затем возвращается назад, чтобы найти последнее плохое слово, которое в этом случае равно bad2
, но когда я делаю это
p=re.compile('([\w \d-]+) (bad1|bad2|bad3).+',re.I)
m=p.search('good1-good2 good3 bad1 bad2 bad3')
m.group(1)
оно снова возвращает good1-good2 good3 bad1
. Не могли бы вы объяснить это? Потому что может возникнуть проблема с моим пониманием greediness
в regex? Хотя я решил решить эту проблему с помощью регулярного выражения ([\w \d-]+?) (bad1|bad2|bad3).+
, но все же я не понимаю, почему использование ([\w \d-]+) (bad1|bad2|bad3).+
всегда возвращает первое плохое слово (bad1 в этом случае)?
Спасибо за внимание.
Edit: Но предположим, что у меня есть шаблон только с хорошими словами и без плохих слов, как good1-good2 good3--only good words
то, что должно быть регулярное выражение? Я пробовал это регулярное выражение ([\w \d-]+?) ?(bad1|bad2|bad3)?.*
, но это возвращает первую букву шаблона.
Первый суб-модель также жадный, поэтому он получает большую часть его может совпадать, затем второй и т. д. – poncha
@poncha моя проблема - это третий случай. почему он возвращает 'good1-good2 good3 bad1', когда я смотрю в' good1-good2 хорошо3 плохой1 плохой2 плохо3'? Он должен был возвратить 'good1-good2 good3 bad1 bad2' в соответствии с моим пониманием жадного – lovesh