这是我的文本(它也会通过其他文本查找,但这是我遇到的麻烦):
<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)
我希望我没有错,但如果是这样的话,请告诉我。