为什么我的正则表达式模式中的条件语句在不应该改变任何东西时会摆脱其他匹配项?



这是我的文本(它也会通过其他文本查找,但这是我遇到的麻烦):

<a href="/wiki/Basketball" title="Basketball">basketball</a>, the 
<li class="interwiki-cs"><a href="//cs.wikipedia.org/wiki/" title="" lang="cs" hreflang="cs">esky</a><
<li class="interwiki-da"><a href="//da.wikipedia.org/wiki/" title="" lang="da" hreflang="da"><b>Dansk</b></a></li>

我试图得到3个匹配,其中2组(由分号分隔)是:

/wiki/Basketball;basketball
//cs.wikipedia.org/wiki/;esky
//da.wikipedia.org/wiki/;Dansk

使用这个模式:(?<=<a href=")(.*?)".*?>([ws./,0-9]*?)<,我可以正确匹配前两个。为了尝试也得到最后的匹配,我添加了一个条件来检查<b>:(?<=<a href=")(.*?)".*?>(<?)(?(2)b>)([ws./,0-9]*?)<。这使最后一个匹配正确,但现在前两个不匹配。

你能解释一下为什么会发生这种情况,正确的方法是什么吗?

老实说,我自己很难理解"有条件的"。我问了关于这件事的问题,但没有得到答案。

我利用[^]并这样做:

re.findall('(?<=<a href=")(.*?)".*>([^>]+)<',string)

re.findall('(?<=<a href=")(.*?)".*(?<=>)([^>]+)(?=<)',string)

在这两种情况下,第二组匹配'>'之后的非空字符串,不包含'>'并且位于'<'之前。它应该匹配最后non_empty标签之间的字符串。

通过添加'?' to the '。在第一组之后,第二组应该匹配标签之间的第一个non_empty字符串:

re.findall('(?<=<a href=")(.*?)".*?(?<=>)([^>]+)(?=<)',string)
另外,下面的代码片段应该捕获标签之间的所有非空字符串:
re.findall('(?<=>)([^>]+)(?=<)',string)

我希望我没有错,但如果是这样的话,请告诉我。

相关内容