如果前后没有匹配,正则表达式匹配

6
如何只匹配“suck”,而不是“honeysuckle”中的一部分?
使用回顾后发和前瞻,我可以匹配除“honeysuck”或“suckle”之外的“suck”,但它也无法捕获类似于“honeysucker”的内容;在这种情况下,表达式应该匹配,因为它不以“le”结尾:
re.search(r'(?<!honey)suck(?!le)', 'honeysucker')

目标是匹配所有不是“金银花”实例的“吸”的实例。如果不清楚,请原谅... - user3117610
目标是匹配一个字符串是否包含“suck”,但不包含“honeysuckle”。我们可以永远争论为什么有人想要这样做,但这并不能回答使用正则表达式是否可能实现的问题。 - user3117610
好的,我认为你所问的问题(并且不太清楚)是为什么'honeysucker' 匹配,但它应该因为它以er结尾。你让它听起来相反了。我会澄清这个问题。 - Martijn Pieters
这是一个比较困难的问题,因为预查是独立的。查找不属于特定较大单词的单词,并不是我会使用正则表达式解决的问题。 - Martijn Pieters
@MartijnPieters:你可以通过将前瞻断言放在后顾断言内部(或者反过来)使它们相互依赖。 - Tim Pietzcker
4个回答

5
您需要嵌套环视断言:

>>> 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)

2

以下是一种不使用正则表达式的解决方案:

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

现在:

re.search('suck',s)

这将适用于以下任何字符串:金银花很糟糕这很糟糕,甚至是正则表达式很糟糕


你需要使用 re.findall() 来“匹配所有'suck'的实例”。 - nodakai

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)}"
}

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接