如何用正则基于月份缩写分割文本并提取对应内容?
解决提取月份缩写开头文本块的问题
我懂你现在的需求——就是要从那段带换行的文本里,把每个以月份缩写(apr、may、jan这类)开头的完整段落块提取出来,对吧?你之前用贪婪匹配的正则没搞定,那咱们来捋清楚怎么实现。
问题分析
每个目标块的特征很明确:
- 开头是指定的月份缩写(比如apr、may、jan)
- 内容会跨换行,一直到下一个月份缩写的前一刻,或者文本的结尾
之前用贪婪匹配.*会直接从第一个月份缩写匹配到文本末尾,这显然不是你想要的,所以得用非贪婪匹配加上边界判断。
正确的实现代码
直接上能跑的代码,注释里会讲清楚每个部分的作用:
import re # 你的输入文本 text = "apr25, 2016\nblah blah\npow\nmay22, 2017\nasdf rtys\nqwer\njan9, 2018\npoiu\nlkjhj yertt" # 定义正则:匹配指定月份缩写开头的块,直到下一个月份缩写或文本结束 # 可根据需要扩展月份缩写(比如加feb、jun等) month_pattern = re.compile(r'(apr|may|jan).*?(?=(apr|may|jan)|$)', re.DOTALL) # 提取所有匹配的块 result = [match.group(0) for match in month_pattern.finditer(text)] # 打印结果看看 print(result)
正则解释
咱们拆解一下这个正则的关键部分:
(apr|may|jan):指定要匹配的月份缩写,作为每个块的起始标记;如果需要支持更多月份,直接在这里添加缩写就行,比如(apr|may|jan|feb|jun).*?:非贪婪匹配任意字符,这样不会一口气吞掉所有内容,而是匹配到下一个边界就停止(?=(apr|may|jan)|$):正向预查,用来确定匹配的结束边界——要么遇到下一个月份缩写,要么到文本末尾,这样就能精准切割每个块re.DOTALL:这个参数必须加!因为默认情况下.不会匹配换行符,加了它之后,.就能处理跨换行的内容了
运行结果
执行代码后,输出正好是你期望的格式:
[ "apr25, 2016\nblah blah\npow\n", "may22, 2017\nasdf rtys\nqwer\n", "jan9, 2018\npoiu\nlkjhj yertt" ]
内容的提问来源于stack exchange,提问作者user1290793
相关产品推荐
相关产品推荐

