如何用正则提取跨多行的Date/Month至Per Cent的天气分段内容
解决跨多行天气块的正则匹配问题
嘿,我懂你遇到的这个正则坑!咱们一步步来拆解:
为什么之前的正则不行?
带
^和$的正则没结果:re.MULTILINE模式下,^和$只匹配单行的开头和结尾,但你的每个天气块是跨多行的——开头的Date/Month在一行,结尾的Per Cent在另一行,所以整个块不可能同时满足^(行首)和$(行尾)的条件,自然匹配不到。不带边界的正则匹配成大串:
Date.+Cent用了贪婪的+量词,再加上re.DOTALL让.能匹配换行符,它会从第一个Date/Month开始,一直“吃”到最后一个Per Cent才停下,所以直接把所有块合并成了一个大字符串。
正确的正则写法
要精准拆分每个独立的天气块,关键是用非贪婪匹配,让正则在遇到第一个Per Cent就停止,而不是一直吃到最后一个。
基础版(适用于Date/Month不一定在行首的情况)
import re result = re.findall(r'Date/Month.*?Per Cent', daily_forecast_text, flags=re.DOTALL)
严谨版(确保Date/Month是每个块的行首,避免误匹配中间的Date文本)
如果你的天气块确实都是以行首的Date/Month开头,加上^并配合re.MULTILINE更稳妥:
result = re.findall(r'^Date/Month.*?Per Cent', daily_forecast_text, flags=re.MULTILINE | re.DOTALL)
关键说明
.*?:非贪婪量词,会匹配尽可能短的内容,遇到第一个Per Cent就停止,刚好对应单个天气块的范围。re.DOTALL:让.可以匹配换行符,这样跨多行的天气文本也能被覆盖。re.MULTILINE:配合^使用时,会让^匹配每一行的开头,确保只抓那些真正作为块起始的Date/Month。
举个例子,假设你的文本是:
Date/Month 01/10
Cloudy with light rain
Humidity: 75 Per Cent
Date/Month 02/10
Sunny intervals
Humidity: 60 Per Cent
用上面的正则会得到两个独立的字符串,正好对应两天的天气数据,完美拆分!
内容的提问来源于stack exchange,提问作者lamwaiman1988
相关产品推荐
相关产品推荐

