我有一些文本,其中每一行文本都有一些好词和一些坏(不需要的)词。所以模式可能看起来像这样
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
我正在使用python所以这就是我所做的
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
我认为因为+
是贪婪的所以+
in([\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
?虽然我已经想出通过使用这样的正则表达式来解决这个问题,([\w \d-]+?) (bad1|bad2|bad3).+
但我仍然不明白为什么使用([\w \d-]+) (bad1|bad2|bad3).+
总是返回第一个坏词(在这种情况下是 bad1)?
谢谢你的时间。
编辑:
但是假设我有一个只有好词没有坏词的模式,
good1-good2 good3--only good words
那么正则表达式应该是什么?我试过这个正则表达式([\w \d-]+?) ?(bad1|bad2|bad3)?.*
,但这会返回模式的第一个字母。