You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python正则表达式实现按递增0.1的数字序列分割字符串

更优雅的解决方案:结合正则与序列处理

确实,单纯用正则表达式无法直接完成数值差值判断(因为正则是基于文本模式匹配,不支持算术运算),但我们可以结合正则提取数字与位置,再通过简单的序列分析来实现你的需求——既在0.1递增的数字处分割字符串,又捕获这些递增序列。

核心思路

  1. 用正则提取所有目标数字:同时记录每个数字在原字符串中的起始/结束位置,方便后续分割。
  2. 规避浮点数精度问题:将数字乘以10转为整数,避免直接比较浮点数时的精度误差(比如1.2 + 0.1可能变成1.3000000000000001)。
  3. 识别0.1递增序列:遍历数字序列,找出连续差值为1(对应原数值0.1)的片段。
  4. 分割原字符串:根据递增序列的位置,在原字符串中标记分割点并完成分割。

完整Python代码

import re

def split_and_capture_increments(input_str):
    # 匹配x.x格式的数字(支持多位整数部分,如12.3)
    num_pattern = re.compile(r'\d+\.\d')
    matches = list(num_pattern.finditer(input_str))
    
    if not matches:
        return [input_str], []  # 无数字时返回原字符串和空序列
    
    # 提取数字值并转换为放大10倍的整数,避免浮点数精度问题
    numbers = [float(m.group()) for m in matches]
    scaled_nums = [int(round(num * 10)) for num in numbers]
    
    split_positions = []
    captured_sequences = []
    current_sequence = [numbers[0]]
    
    # 遍历数字序列,识别0.1递增的片段
    for i in range(1, len(scaled_nums)):
        if scaled_nums[i] - scaled_nums[i-1] == 1:
            current_sequence.append(numbers[i])
            # 记录下一个数字的起始位置作为分割点
            split_positions.append(matches[i].start())
        else:
            # 当前序列长度≥2时,加入捕获列表
            if len(current_sequence) >= 2:
                captured_sequences.append(current_sequence)
            current_sequence = [numbers[i]]
    
    # 处理最后一个序列
    if len(current_sequence) >= 2:
        captured_sequences.append(current_sequence)
    
    # 生成最终的分割片段
    split_points = [0] + split_positions + [len(input_str)]
    split_parts = [input_str[split_points[i]:split_points[i+1]] for i in range(len(split_points)-1)]
    
    return split_parts, captured_sequences

# 示例用法
sample_str = "Hello 1.2 world 1.3 foo 1.4 bar 2.0 baz 2.1 qux"
parts, sequences = split_and_capture_increments(sample_str)

print("分割后的片段:")
for part in parts:
    print(f"- {repr(part)}")

print("\n捕获的递增序列:")
for seq in sequences:
    print(f"- {seq}")

代码说明

  • 正则匹配:r'\d+\.\d'匹配任意整数部分(一位或多位)加一位小数的数字,如果你需要限制整数部分为一位,可以改成r'\d\.\d'。
  • 精度处理:通过round(num *10)将浮点数转为整数,确保1.2和1.3的差值判断准确。
  • 分割逻辑:分割点选在递增序列中后一个数字的起始位置,这样每个分割片段会包含前一个数字及其前后的文本,后一个数字则作为下一个片段的开头。
  • 序列捕获:自动收集所有长度≥2的连续0.1递增序列。

示例输出

分割后的片段:
- 'Hello 1.2 world '
- '1.3 foo '
- '1.4 bar 2.0 baz '
- '2.1 qux'

捕获的递增序列:
- [1.2, 1.3, 1.4]
- [2.0, 2.1]

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:42:58