Python re模块正则匹配兼容不同格式字符串的问题咨询
解决马来西亚COVID-19疫情数据日期提取兼容问题
嘿,我来帮你搞定这个问题!首先咱们得先搞清楚原来的代码为啥会翻车:
你的原正则^(.*?\(.*?\))\n其实是在匹配带括号的行,而不是专门匹配日期行——这就导致在列表b里,日期行(Sehingga 9 Ogos 2021.)没有括号,正则根本没找到它,反而把下面带括号的Selangor数据行匹配出来了。再加上你用split(":")只处理冒号,Selangor行里没有冒号,所以直接返回了整行内容,自然不符合预期。
那怎么修改才能兼容两种格式呢?咱们可以从两个核心点入手:
1. 精准匹配日期行
日期行的共同特征很明显:都是以Sehingga开头(马来西亚语“截至”的意思),结尾要么是冒号要么是句号。咱们可以写一个专门匹配这个特征的正则:
r"^(Sehingga .*?)[.:]$"
^:匹配行开头(Sehingga .*?):分组提取从Sehingga开始的内容,非贪婪匹配避免多拿[.:]:匹配结尾的冒号或句号- 别忘了加
flags=re.M(多行模式),这样^能匹配每一行的开头
2. 统一提取干净的日期
匹配到目标行后,直接用分组提取的内容就可以得到不带标点的日期,也可以用字符串方法去掉结尾的标点(比如rstrip(":.")),两种方式都很稳妥。
修改后的完整代码示例
import re # 示例列表b的内容 b = ["""Sehingga 9 Ogos 2021. Selangor - 5,740 (470,755) Johor - 1,234 (123,456)"""] out = [] for v in b: # 匹配符合特征的日期行,提取日期部分 date_matches = re.findall(r"^(Sehingga .*?)[.:]$", v, flags=re.M) for date in date_matches: # 去掉可能的首尾空格,确保日期干净 out.append(date.strip()) # 打印结果,应该输出 "Sehingga 9 Ogos 2021" print(out[0])
额外优化思路
如果以后日期行的结尾标点可能增加(比如分号),只需要把正则里的[.:]改成[.:;]这类扩展的字符集就行,灵活性很高。另外,如果你的日期行不一定以Sehingga开头,也可以把正则改成^(.*?)[.:]$,匹配所有开头的、结尾是指定标点的行,同样能兼容两种格式。
内容的提问来源于stack exchange,提问作者terry555




