如何用Python正则匹配<system>标签外的abc0/abc1/abc2内容
匹配不在
<system>标签内指定字符串的Python re实现 该需求可以通过Python re 模块实现,非嵌套标签场景下无需引入额外解析库。
核心思路
- 利用正则交替匹配的优先级规则,优先匹配完整的
<system>起始标签、标签内部内容、结束标签整体,匹配到该部分时直接消耗对应字符,不做捕获 - 前序分支未匹配到的内容即为标签外部的文本,在这部分内容中匹配目标字符串
abc0/abc1/abc2即可 - 该方案避开了复杂的前后位置断言,可适配标签属性中包含目标字符串、标签跨多行等边界场景
测试样例
待匹配原始字符串:
abc0<system id="101" display-name="abc1">abc1</system>abc1<system id="101" display-name="abc2">abc2</system>abc2
预期匹配结果(仅标签外内容):开头的abc0、第一个标签闭合后的abc1、末尾的abc2,标签属性内、标签包裹的abc1/abc2均不纳入匹配结果。
可运行代码
import re raw_text = 'abc0<system id="101" display-name="abc1">abc1</system>abc1<system id="101" display-name="abc2">abc2</system>abc2' # 正则规则:前半段匹配完整system标签跳过,后半段捕获目标abc序列 regex = r'<system[^>]*>.*?</system>|(abc[012])' # 若标签可能跨多行,添加re.DOTALL标志 result = [ match.group(1) for match in re.finditer(regex, raw_text, flags=re.DOTALL) if match.group(1) is not None ] print(result) # 输出: ['abc0', 'abc1', 'abc2']
边界说明
- 该方案仅适用于
<system>标签无嵌套的场景,绝大多数常规标记文本场景都满足该前提 - 如果需要匹配其他标签外的内容,只需将正则第二个捕获组内的
abc[012]替换为对应匹配规则即可 - 如果待处理文本存在标签嵌套、标签不闭合等复杂情况,不要使用正则,改用
lxml、BeautifulSoup等结构化解析库处理。
内容的提问来源于stack exchange,提问作者Get It Done
相关产品推荐
相关产品推荐

