Python正则表达式实现按递增0.1的数字序列分割字符串
更优雅的解决方案:结合正则与序列处理
确实,单纯用正则表达式无法直接完成数值差值判断(因为正则是基于文本模式匹配,不支持算术运算),但我们可以结合正则提取数字与位置,再通过简单的序列分析来实现你的需求——既在0.1递增的数字处分割字符串,又捕获这些递增序列。
核心思路
- 用正则提取所有目标数字:同时记录每个数字在原字符串中的起始/结束位置,方便后续分割。
- 规避浮点数精度问题:将数字乘以10转为整数,避免直接比较浮点数时的精度误差(比如
1.2 + 0.1可能变成1.3000000000000001)。 - 识别0.1递增序列:遍历数字序列,找出连续差值为1(对应原数值0.1)的片段。
- 分割原字符串:根据递增序列的位置,在原字符串中标记分割点并完成分割。
完整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
相关产品推荐
相关产品推荐

