Python正则提取子串前后内容:分组匹配异常问题求助
正则匹配问题解决方案
你的正则无法得到预期结果,核心原因是第一个捕获组的.*?会跨<li>标签匹配,把中间不含URL的<li>Two</li>也包含进去,导致分组错误。
修正后的代码
import re txt = '<li>one. URL : <a href="http://local.ru">http://local.ru</a> (10.02.2022).</li><li>Two</li><li>Three. URL : <a href="https://local.ru">https://local.ru</a> (15.11.2021).</li>' result = re.findall(r'(<li>(?:(?!</li>).)*?)\s?URL\s?:\s?(<a.*?>).*?(</a>.*?</li>)', txt) print(result)
关键修改说明
把第一个捕获组的.*?替换为(?:(?!</li>).)*?:
(?:...)是非捕获分组,用于包裹断言逻辑(?!</li>)是负向前瞻,确保当前位置后面不是</li>- 整个片段的作用是:匹配
<li>开头的内容,只匹配到当前<li>内部、URL标识之前的部分,不会跨越到其他<li>标签
运行后将得到你期望的输出:
[('<li>one.', '<a href="http://local.ru">', '</a> (10.02.2022).</li>'), ('<li>Three.', '<a href="https://local.ru">', '</a> (15.11.2021).</li>')]
内容的提问来源于stack exchange,提问作者Vadim Nva
相关产品推荐
相关产品推荐

