Python正则表达式问题:提取<li></li>标签外的字符串
修正正则表达式提取非标签包裹的内容
原正则的问题
你之前使用的^(?!<li>.*$).*(?<!</li>)是基于整行匹配的规则,仅能识别完全不包含<li>开头或</li>结尾的整行内容。一旦<li>标签前后附带表情、文本等额外内容(比如😀<li>列表项</li>😃),整行不符合规则,导致这些非<li>包裹的内容也会被遗漏。
修正方案(推荐用替换思路)
更高效的方式是替换掉所有完整的<li>...</li>块,剩余内容就是你需要的非包裹文本:
- 正则表达式:
<li>.*?</li> - 关键说明:
.*?使用非贪婪匹配,避免误匹配多个<li>标签(比如同时匹配<li>项1</li><li>项2</li>整个内容)- 若处理多行文本,需开启跨行匹配模式:
- Python:添加
re.DOTALL修饰符 - JavaScript:添加
s修饰符 - 其他语言:开启对应的多行/单行匹配选项
- Python:添加
示例演示
输入文本:
这是普通文本 <div>div内的内容</div> 😀<li>列表项1</li>😃 <li>列表项2</li> 这是li外的另一行文本
执行替换后输出:
这是普通文本 <div>div内的内容</div> 😀😃 这是li外的另一行文本
若需直接提取(非替换)
如果一定要用提取逻辑,可使用正向/反向否定预查匹配所有不在<li>和</li>之间的内容,但这种方式对复杂HTML兼容性较差,仅推荐用于简单场景:
(?<!<li>.*).*?(?!.*</li>)
内容的提问来源于stack exchange,提问作者Jerykso
相关产品推荐
相关产品推荐

