如何使用Pandas将单列原始日志数据按规则拆分为多列?
解决方案:用正则表达式拆分结构化日志数据
你可以利用正则表达式结合Pandas的str.extract()方法来精准拆分这类具有固定格式的日志数据。核心思路是通过正则捕获分组匹配你需要的5个字段:
正则表达式逻辑
针对你的日志格式,我们构建包含5个捕获组的正则:
^(\w{3} \w{3} \d{2} \d{2}:\d{2}:\d{2}) (-\d{4}) (\[.*?:) (.*?\](?:: .*?)?(?=\. |$))(?:\. (.*))?$
各分组对应字段:
- 第一组:匹配日期时间(如
Sun Jan 11 07:46:33) - 第二组:匹配时区(如
-0600) - 第三组:匹配AZ部分(如
[LKSDFLKLKJF-56:) - 第四组:匹配Error部分(从AZ后的内容到
.分隔符或行尾) - 第五组:匹配Action部分(
.后的剩余内容,无分隔符则直接取行尾内容)
完整代码
import pandas as pd import os # 加载数据 Raw_Data_load = os.path.join("Resources", "Raw_Data.csv") raw_data_df = pd.read_csv(Raw_Data_load) # 定义正则表达式 pattern = r'^(\w{3} \w{3} \d{2} \d{2}:\d{2}:\d{2}) (-\d{4}) (\[.*?:) (.*?\](?:: .*?)?(?=\. |$))(?:\. (.*))?$' # 提取分组并生成新DataFrame split_df = raw_data_df['Raw Data'].str.extract(pattern) split_df.columns = ['Data', 'Time', 'AZ', 'Error', 'Action'] # 处理无分隔符的行,补全Action字段 split_df['Action'] = split_df['Action'].fillna(raw_data_df['Raw Data'].str.extract(r': (.*)$')[0]) # 查看结果 print(split_df)
结果验证
运行后会得到与期望格式完全一致的DataFrame:
| Data | Time | AZ | Error | Action |
|---|---|---|---|---|
| Sun Jan 11 07:46:33 | -0600 | [LKSDFLKLKJF-56: | bacml: warn:error]: Address failed 7a-123478563412. | Reason: Failed to access remote. |
| Mon Feb 21 13:31:45 | -0400 | [LHHKJLKJD-01: | repi_exemptXY: create.done:info]: | params: {'1', 'app'}: |
| Thu May 15 12:33:06 | -0500 | [DRHHFJJHS-08: | UDPAgentRead: SessionFailed:debug]: | Session Manager (999) failed |
补充说明
- 正则中的
(?=\. |$)是正向预查,确保Error部分在遇到.或行尾时停止匹配 - 最后的
fillna处理是为了兼容没有.分隔符的行,直接提取:后的内容作为Action
内容的提问来源于stack exchange,提问作者Blind Bartimaeus
相关产品推荐
相关产品推荐

