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

如何实现仅拼接字符串中的连续数字?

合并字符串中连续被空格分隔的数字

这个需求很常见,我来给你几种可行的解决方案,从简洁的正则写法到手动遍历的实现都有,你可以根据自己的场景选择:

方法一:正则表达式单次替换(高效简洁)

这种方法用正则直接匹配所有被空格分隔的数字序列,然后一次性移除序列内的空格,是效率最高的方式:

import re

def merge_consecutive_numbers(input_str):
    # 匹配一个或多个数字开头,后面跟着若干组「空格+数字」的序列
    num_sequence_pattern = re.compile(r'(\d+(?: \d+)+)')
    
    # 回调函数:把匹配到的数字序列里的空格全部移除
    def replace_spaces_in_numbers(match):
        return match.group(0).replace(' ', '')
    
    return num_sequence_pattern.sub(replace_spaces_in_numbers, input_str)

# 测试你的示例
original_string = "Hello this is 123 456 a string for test 12 345 678. I want to merge 12 34 56"
merged_string = merge_consecutive_numbers(original_string)
print(merged_string)
# 输出: Hello this is 123456 a string for test 12345678. I want to merge 123456

原理说明:

  • 正则\d+(?: \d+)+的作用:
    • \d+:匹配一个或多个数字(序列的第一个数字组)
    • (?: \d+):非捕获组,匹配「空格+一个或多个数字」的组合,?:表示这个组不会被单独捕获,只是用来重复匹配
    • +:表示这个非捕获组可以出现1次或多次,这样就能匹配任意长度的「数字 数字 数字...」序列
  • 回调函数会把每个匹配到的数字序列里的空格全部替换为空,直接合并成完整数字串

方法二:手动遍历分割单词(无需正则,逻辑直观)

如果你不想用正则,也可以通过分割字符串为单词,逐个判断并收集数字序列:

def merge_consecutive_numbers(input_str):
    # 按空格分割字符串为单词列表
    words = input_str.split()
    result = []
    current_num_group = []
    
    for word in words:
        # 判断当前单词是否是纯数字
        if word.isdigit():
            current_num_group.append(word)
        else:
            # 如果之前收集了数字,先合并加入结果
            if current_num_group:
                result.append(''.join(current_num_group))
                current_num_group = []
            # 加入非数字单词
            result.append(word)
    
    # 处理字符串末尾可能剩下的数字序列
    if current_num_group:
        result.append(''.join(current_num_group))
    
    # 把结果列表重新拼接成字符串
    return ' '.join(result)

# 测试同样有效
original_string = "Hello this is 123 456 a string for test 12 345 678. I want to merge 12 34 56"
print(merge_consecutive_numbers(original_string))

原理说明:

  • 先把字符串按空格拆分成单个单词,逐个检查每个单词是否是纯数字
  • 如果是数字,就暂时存入临时列表;遇到非数字单词时,先把临时列表里的数字合并成字符串,加入结果列表,再把非数字单词加入
  • 遍历结束后,别忘了处理最后可能遗留的数字序列(比如字符串以数字结尾的情况)

方法三:正则循环替换(简单易懂,适合短字符串)

这种方法反复查找「数字+空格+数字」的模式,替换成无空格的组合,直到没有匹配项为止:

import re

def merge_consecutive_numbers(input_str):
    # 匹配单个数字+空格+单个数字的模式
    single_space_pattern = re.compile(r'(\d) (\d)')
    # 循环替换,直到找不到匹配的模式
    while single_space_pattern.search(input_str):
        input_str = single_space_pattern.sub(r'\1\2', input_str)
    return input_str

# 测试示例
original_string = "Hello this is 123 456 a string for test 12 345 678. I want to merge 12 34 56"
print(merge_consecutive_numbers(original_string))

原理说明:

  • 每次找到一个被空格分隔的两个数字(比如3 4),替换成34
  • 循环这个过程,直到字符串里再也没有「数字+空格+数字」的组合,所有连续数字就都合并完成了
  • 这种写法最简单,但对于很长的数字序列(比如1 2 3 ... 100)需要多次替换,效率略低,适合短字符串场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:57:25