正则表达式匹配,如果不是之前和之后

时间:2014-02-17 08:33:28

标签: python regex

如果不是“金银花”的一部分,我怎么能匹配'suck'?

使用lookbehind和lookahead我可以匹配suck,如果不是'honeysuck'或'suckle',但它也无法捕获像'honeysucker';这里表达式匹配,因为它不会以le结尾:

re.search(r'(?<!honey)suck(?!le)', 'honeysucker')

4 个答案:

答案 0 :(得分:4)

您需要嵌套环绕声断言:

>>> import re
>>> regex = re.compile(r"(?<!honey(?=suckle))suck")
>>> regex.search("honeysuckle")
>>> regex.search("honeysucker")
<_sre.SRE_Match object at 0x00000000029B6370>
>>> regex.search("suckle")
<_sre.SRE_Match object at 0x00000000029B63D8>
>>> regex.search("suck")
<_sre.SRE_Match object at 0x00000000029B6370>

等效的解决方案是suck(?!(?<=honeysuck)le)

答案 1 :(得分:2)

这是一个不使用正则表达式的解决方案:

s = s.replace('honeysuckle','')

现在:

re.search('suck',s)

这适用于以下任何字符串:honeysuckle sucksthis sucks甚至regular expressions suck

答案 2 :(得分:1)

我相信你应该在不同的数组中分离你的异常,以防将来你希望添加不同的规则。这将更容易阅读,并且如果需要将来更快更新。

我在Ruby中的建议是:

words = ['honeysuck', 'suckle', 'HONEYSUCKER', 'honeysuckle']

EXCEPTIONS = ['honeysuckle']

def match_suck word
  if (word =~ /suck/i) != nil
    # should not match any of the exceptions
    return true unless EXCEPTIONS.include? word.downcase
  end
  false
end

words.each{ |w|
  puts "Testing match of '#{w}' : #{match_suck(w)}"
}

答案 3 :(得分:0)

>>>string = 'honeysucker'
>>>print 'suck' in string
True