2013-03-18 30 views
0

只要没有另一个字符串,我就会努力使正则表达式在匹配某个特定模式的地方工作。例如,如果字符串恰好在另一个字符串之前,则为否定匹配

Accessory for MyProduct01 <<< Should be classified as an accessory 
MyProduct01 with accessory << Should be classified as a product 

所以我需要的东西添加到我的“附件”正则表达式,像“匹配‘附件’,只要之前的字不是‘同’”。

我已经看到一些例子,其中人们使用负向预测来发现一个单词是否在字符串中的任何位置,但我想对该单词的位置进行更加具体的否定。喜欢的东西:

(?!with\s)accessory 
+0

这不是负面的背后;这是一个消极的外观__ahead__ :) – 2013-03-18 12:55:37

+1

准确地说:我认为你想要(?<!with \ s)配件。 正如你可能从序列中猜测的那样(?<!,这种东西起源于perl。 – Bristol 2013-03-18 13:06:05

回答

2

在您的正则只需使用一负向后看:

(?<!with\s)accessory 
+0

这个工作,即使在python中。但是,我犯了一个错误,我实际上使用搜索不匹配,虽然我不确定如果这会产生影响,那么对于其他可能感兴趣的人也是有效的。 ((?<!with \ s)|(?<!including \ s)) – alj 2013-03-18 13:47:52

+0

这个正则表达式可以用于搜索和关键点是后视需要有一个有限的长度(你不能使用'*'或'+'等) – Bohemian 2013-03-18 20:44:14

+0

在你的评论中的正则表达式没有意义:ORed后视表达式总是*真*只要有两个,就像这个'(?<!with \ s)(?<!including \ s)accessories' – Bohemian 2013-03-18 21:29:52

0

因为Python并不支持无限lookbehinds,我想你将不得不使用类似当前正在使用什么先行,但改变原有的格局有点。

^(?!\bwith\b.*\baccessory\b)(?=.*\b(accessory)\b) 

这里,负向前视用于确保“附件”不会出现在“with”之后。然后,正面预测用于确保字符串中出现“附件”一词,如果您由于某种原因需要捕获它,则会使用一个组捕获它。

基于我写上述的方式,您需要使用search方法而不是match方法。为了使用match,这需要整个搜索字符串匹配的模式,你需要更增添几分到模式:

^(?!\bwith\b.*\baccessory\b)(?=.*\b(accessory)\b).*$ 
相关问题