python--正则表达式过滤数据

该博客介绍了如何使用Python的正则表达式模块`re`解析文本文件,从日志中提取特定模式的数据。通过匹配模式,将数据转换为JSON格式,并根据不同的数据类型分别存储到`config_data`, `run_data`, 和 `send_msg`列表中。最终,将这些数据写入CSV文件进行保存。" 115523949,9238976,iLSMOA-2020:一种迭代问题重构的大规模多目标优化算法,"['优化算法', '多目标优化', '遗传算法', '进化计算', '机器学习']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import re
import csv
import json

CONFIG_HEADER = ["ChangeSrc", "timestamp", "power", "bright", "ct", "device_id"]
RUN_HEADER = ["ChangeSrc", "timestamp", "ManualAD", "PIR", "BrightAD", "device_id"]
SEND_HEADER = ["bright", "ct", "power", "L1", "bright_alpha", "bright_beta", "ct_alpha", "ct_beta", "changeSrc"]

def read_data(filename):
    config_data = [CONFIG_HEADER]
    run_data = [RUN_HEADER]
    send_msg = [SEND_HEADER]
    for line in open(filename):
        match = re.match("(\[.*\]) (.*) message - (\d*): (\{.*\})", line.strip())
        mode = match.group(2)
        if mode == "recv":
            message = json.loads(match.group(4))
            if message["topic"] == "config":
                config_data.append([message[i] for i in CONFIG_HEADER])
            else:
                run_data.append([message[i] for i in RUN_HEADER])
        else:
            message = json.loads(match.group(4))["outputs"][0]["fields"]
            message = dict([(i["oKey"], i["oValue"]) for i in message])
            send_msg.append([message[i] for i in SEND_HEADER])
    return config_data, run_data, send_msg

def write_data(data, filename):
    with open(filename, "wb") as f:
        writer = csv.writer(f)
        writer.writerows(data)

if __name__ == "__main__":
    filename = "C:/Users/Administrator/Desktop/test002.txt"
    config_data, run_data, send_msg = read_data(filename)
    if len(config_data) > 1:
        write_data(config_data, "C:/Users/Administrator/Desktop/config_data.csv")
    if len(run_data) > 1:
        write_data(run_data, "C:/Users/Administrator/Desktop/run_data.csv")
    if len(send_msg) > 1:
        write_data(send_msg, "C:/Users/Administrator/Desktop/send_msg.csv")
### 匹配日期格式 `yyyy-mm-dd` 的正则表达式 为了生成一个能够匹配类似于 `2025-04-25` 这种 `yyyy-mm-dd` 格式的正则表达式,以下是详细的分析和解决方案: #### 正则表达式设计 1. **年份部分** 年份应为四位数字,范围通常是 1900 至未来某一年。假设我们只考虑公元纪元后的年份(即大于等于 1900),可以使用 `\d{4}` 或 `(19|20)\d{2}` 来限定年份的合理区间[^1]。 2. **月份部分** 月份是一个两位数,取范围为 `01` 到 `12`。可以通过 `(0[1-9]|1[0-2])` 来描述这一规则。 3. **日期部分** 日子也是一个两位数,具体取决于不同的月份天数限制。对于非闰年的二月最多有 28 天;而对于其他大月(如一月、三月等)则是 31 天,小月(四月、六月等)则是 30 天。因此可采用以下逻辑: - 如果是大月,则日子范围为 `01` 至 `31`; - 若为小月,则范围缩小至 `01` 至 `30`; - 特殊情况下的二月仅限于 `01` 至 `28` 或者在闰年情况下到 `29`。 基于这些条件组合而成完整的正则表达式如下所示: ```regex ^(19|20)\d\d-(0[1-9]|1[012])-([12][0-9]|3[01]|0[1-9])$ ``` 但是考虑到实际应用中可能存在的复杂性(例如需要排除非法日期如 February 30th 等特殊情况),推荐更为严谨的形式如下: ```regex ^((?!0000)[0-9]{4})-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$ ``` 这条规则不仅涵盖了基本的要求还额外增加了对零填充数的支持以及防止出现完全无效的情况比如全零年份[^4]。 --- ### PHP 示例代码 下面展示了一个简单的PHP脚本用来检测输入是否符合指定的标准: ```php <?php $date_regex = '/^((?!0000)[0-9]{4})-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$/'; $hiredate = '2025-04-25'; if (!preg_match($date_regex, $hiredate)) { echo 'The provided date does not conform to the YYYY-MM-DD format.'; } else { echo 'Valid date entered!'; } ?> ``` --- ### Python 示例代码 同样也可以利用Python来进行类似的验证操作: ```python import re def validate_date(date_str): pattern = r"^((?!0000)[0-9]{4})-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$" if re.match(pattern, date_str): return True else: return False print(validate_date('2025-04-25')) # Should output: True ``` --- ### 注意事项 尽管上述正则表达式能够在一定程度上过滤大部分不符合标准的数据项,但它并不能彻底解决所有潜在问题,特别是涉及到跨文化差异或者历史遗留数据的时候可能会遇到更多挑战。所以在开发过程中建议结合具体的业务需求进一步调整优化方案[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值