python 3.5.2
提取下面数据 多个组合
[BEGIN]
[b]*****[e]
[b]-------[e]
[b]XXX
DDD
FFF
[e]
[END]
类似这种数据,提取[BEGIN] 和 [END]中间的内容。
思想,两个标签之间任意字符串,且不含有结尾标签组合的结构。
如果中间有 结尾处的字符组合那就没戏了!
r'\[BEGIN\]([\s\S]([^D]|[^N]D|[^E]ND)*)\[END\]'
\[BEGIN\] 开头
([\s\S]([^D]|[^N]D|[^E]ND)*) 中间
[\s\S] 任意字符串 ([^D]|[^N]D|[^E]ND) 不含有END组合的 * 任意个
\[END\] 结尾处字符串
xx = """[BEGIN][L_B]111dsfasfa 黄s423333[L_E][END][BEGIN][L_B]222dsfas 23444[L_E][END]"""y = re.findall(r'\[BEGIN\]([\s\S]([^\]][^D]\]|[^N]D\]|[^E]ND\]|[^\[]END\])*)\[END\]', xx, re.M)print(y)
上面的内容比之前讲解的内容稍长 排除了 [END] 组合
但是可见 后标签越长 匹配串越长 效率越低
之后又经过改进 最终如下
r'\[BEGIN\]([\s\S.]*?)\[END\]'
([\s\S.]*?) 加上?号 不贪婪匹配 点放在 方括号内
基本上完美了。这应该是最终解决方案。
研究学习到了。