为什么这个Python正则表达式的负向前瞻没有起作用?

2024-09-30 04:39:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图收集一组网址,使用beauthoulsoup,有一个非常具体的标准。我要收集的URL必须包含/b-\d+/b-后面跟一系列数值)。但是,我希望忽略包含View%20All的所有url,即使其中包含/b-\d+。 以下是URL示例:

1. http://www.foo.com/bar/b-12312903?sName=View%20All
2. http://www.foo.com/bar/b-832173712873?sName=View%20All
3. http://www.foo.com/bar/b-1208313109283129
4. http://www.foo.com/bar/b-2198123371239489?adCell=W3

对于上面的示例,我要收集的有效URL是#3和#4。我尝试过使用不同的反向lookahead正则表达式,但它们对我不起作用:

^{pr2}$

有人能告诉我我做错了什么吗?在


Tags: comhttpurl示例标准foowwwbar
2条回答
{"href" : re.compile(r"\/b-\d+.+(?!View\%20All)")}
{"href" : re.compile(r"^.+\/b-\d+.+(?!View\%20All$)")}

你哪里错了?在

当我们给出(?!View\%20All)时,它断言View\%20All不能紧跟前面的模式.+匹配

实际上,这意味着未来总是正确的

为了举例说明,让我们检查每个模式匹配的是什么

http://www.foo.com/bar/b-12312903?sName=View%20All

/b-很明显

\d匹配12312903

现在问题出现了

.+匹配任何使否定断言(?!View\%20All)成功的任何内容。在

也就是说

.匹配?s未匹配的字符串是sName=View%20All,它与起始位置s(?!View\%20All)不匹配,因此总是成功地匹配第1行和第2行

demo以获得清晰的图像。在

修复??在

使用lookaround断言时,请修复检查开始的位置

比如说使用类似regex的

^{pr2}$

与3和4相匹配

http://regex101.com/r/aS5yS2/1

这里,?或{}固定了否定断言开始的位置。在

^.*?/b-\d+(?:(?!View%20All).)*$

Demo

或者更快

^{pr2}$

相关问题 更多 >

    热门问题