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

如何用Python正则表达式解析数据块?解决列数可变的第二块问题

嘿,这个问题我之前处理实验室仪器输出的非结构化数据时也碰到过!咱们一步步来拆解解决它,核心思路是先定位数据块的边界,再用正则精准匹配符合格式的行

先明确数据结构(模拟你的场景)

假设你的原始数据长这样(方便对应代码逻辑):

1.1 2.2 3.3
4.4 5.5
6.6 7.7 8.8
9.9 10.10 11.11 12.12
MEAS_END
其他无关的杂乱内容

其中第一块是固定3列的数值行,第二块是2-4列的数值行,直到出现含字母的行(比如MEAS_END)就停止。

具体实现步骤&代码

1. 读取原始数据

先把软件输出的数据读进来,这里用多行字符串模拟从文件读取的场景:

import re

# 模拟原始数据(实际可以用open()读取文件内容)
raw_data = """
1.1 2.2 3.3
4.4 5.5
6.6 7.7 8.8
9.9 10.10 11.11 12.12
MEAS_END
其他杂乱内容...
"""

# 先把数据按行拆分,去掉空行和首尾空格
lines = [line.strip() for line in raw_data.split("\n") if line.strip()]

2. 提取第一块(固定3列)

用正则精准匹配每行是3个数值的行,直接提取并转成数值列表:

# 匹配3列数值的正则(支持正负号、小数)
first_block_pattern = re.compile(r'^-?\d+(\.\d+)? -?\d+(\.\d+)? -?\d+(\.\d+)?$')

first_block_data = []
for line in lines:
    if first_block_pattern.match(line):
        # 拆分并转成float类型
        first_block_data.append(list(map(float, line.split())))
    else:
        # 第一块结束,跳出循环
        break

3. 提取第二块(2-4列,遇到字母停止)

从第一块结束的位置开始,遍历后续行:先判断是否出现字母(结束标志),没出现的话再检查是否是2-4列的数值行:

second_block_data = []
# 匹配2-4列数值的正则
second_line_pattern = re.compile(r'^-?\d+(\.\d+)?( -?\d+(\.\d+)?){1,3}$')

# 从第一块结束的下一行开始遍历
for line in lines[len(first_block_data):]:
    # 检查是否包含字母,是的话停止收集
    if re.search(r'[a-zA-Z]', line):
        break
    # 检查是否符合2-4列数值格式,符合就加入列表
    if second_line_pattern.match(line):
        second_block_data.append(list(map(float, line.split())))

4. 输出结果

运行后你会得到两个规整的列表:

print("第一块数据:", first_block_data)
print("第二块数据:", second_block_data)

输出示例:

第一块数据: [[1.1, 2.2, 3.3]]
第二块数据: [[4.4, 5.5], [6.6, 7.7, 8.8], [9.9, 10.1, 11.11, 12.12]]

一些细节优化

  • 如果你的数值可能有科学计数法(比如1e-5),把正则里的\d+(\.\d+)?改成\d+(\.\d+)?([eE][+-]?\d+)?即可。
  • 如果结束标志是特定关键词(比如END),可以直接用if line == "END"代替正则匹配字母,更精准。
  • 如果第一块有多行(比如连续几行都是3列),上面的代码也能自动处理,直到遇到非3列的行才停止。

内容的提问来源于stack exchange,提问作者HCSthe2nd

火山引擎 最新活动