【发布时间】:2012-06-20 15:17:16
【问题描述】:
我有一些文本,其中每一行文本都有一些好词和一些坏(不需要的)词。所以模式可能看起来像这样
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
我认为因为+ 是贪婪的,所以([\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)?.*,但这会返回模式的第一个字母。
【问题讨论】:
-
第一个子模式也是贪婪的,所以它得到了它可以匹配的最多,然后是第二个,等等......
-
@poncha 我的问题是第三种情况。为什么当我查看
good1-good2 good3 bad1 bad2 bad3时它返回good1-good2 good3 bad1?按照我对贪婪的理解应该是返回了good1-good2 good3 bad1 bad2
标签: regex regex-greedy