正则匹配含指定标识的章节时如何忽略后续无关章节内容?
解决方案
调整正则表达式,增加终止匹配的边界条件即可,修正后的代码如下:
import re text = '7\n\x0c\n7.\tA B C\n\n7.1\tbla bla bla .\n\n7.2\tanother bla bla \n\n7.3\tand another one.\n\n8.\tX Y Z\n\n8.1\tha ha ha \n\n(a)\thohoho ;\n\n(b)\thihihi,\n\n8' print(re.findall(r'^\d+\.\s*A B C.*?(?=\n\d+\.|\Z)', text, flags=re.M|re.S)[0])
运行后即可得到预期输出。
原理解释
- 新增
re.S(DOTALL)标记:让.符号可以匹配换行符,简化跨行匹配的写法 .*?为惰性匹配:不会无限制向后贪婪吞噬内容- 终止边界
(?=\n\d+\.|\Z):正向先行断言,当匹配到下一个顶级章节开头(格式为\n数字.) 或者文本结束位置\Z时就停止匹配,自动截断后续其他章节的内容,不需要提前写死章节编号。
原正则错误原因
之前的正则没有设置匹配终止条件,(?:\n\n.+)*会一直匹配到文本末尾,只要后续存在换行加非空内容就会持续匹配,因此会把下一个章节8的内容也全部包含进去。
内容的提问来源于stack exchange,提问作者Wiliam
相关产品推荐
相关产品推荐

