如何实现仅拼接字符串中的连续数字?
合并字符串中连续被空格分隔的数字
这个需求很常见,我来给你几种可行的解决方案,从简洁的正则写法到手动遍历的实现都有,你可以根据自己的场景选择:
方法一:正则表达式单次替换(高效简洁)
这种方法用正则直接匹配所有被空格分隔的数字序列,然后一次性移除序列内的空格,是效率最高的方式:
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
相关产品推荐
相关产品推荐

