You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动