拆分多单词字符串时如何保留不含数字的单词之间的空格?
可以实现,核心思路是不直接用空格拆分,而是先识别出「含数字的独立段」和「连续无数字的名称段」两类单元再提取,两种常用实现方案如下:
方案1:正则匹配提取(最简洁)
需求中的单元天然符合两类特征,可以直接写正则匹配所有符合要求的片段,不需要做拆分操作:
- 含数字的段:单个无空格、且至少包含一个数字的字符串
- 名称段:连续的、所有组成单词都不含数字的字符串(内部可包含空格)
Python示例代码:
import re input_str = "1 23565 john smith 01/01/2021 another" # 正则说明: # \S*\d\S*:匹配含至少一个数字的无空格字符串 # [^\d\s]+(?:\s+[^\d\s]+)*:匹配连续的不含数字的单词,单词间用空格分隔 pattern = r'\S*\d\S*|[^\d\s]+(?:\s+[^\d\s]+)*' result = re.findall(pattern, input_str) print(result) # 输出:['1', '23565', 'john smith', '01/01/2021', 'another']
方案2:遍历合并法
如果不想依赖正则,可以先全量按空格拆分,再遍历合并连续的无数字单词,步骤如下:
- 按空格把整个字符串拆成单个单词的数组
- 初始化结果数组和临时存储名称片段的变量
- 遍历每个单词:
- 若单词包含数字:先把临时存储的名称片段(如果有)加入结果数组并清空,再把当前单词加入结果数组
- 若单词不包含数字:拼接到临时名称变量中
- 遍历结束后如果临时变量还有值,补充到结果数组末尾
JavaScript示例代码:
const input = "1 23565 john smith 01/01/2021 another"; const words = input.split(' '); const result = []; let namePart = ''; for (const word of words) { if (/\d/.test(word)) { if (namePart) { result.push(namePart.trim()); namePart = ''; } result.push(word); } else { namePart += ` ${word}`; } } if (namePart) { result.push(namePart.trim()); } console.log(result); // 输出:['1', '23565', 'john smith', '01/01/2021', 'another']
注意:两种方案都依赖你给出的前提约束「名称单词的前后始终为含数字的单词」,如果存在名称出现在字符串最开头的场景,调整匹配/合并逻辑即可适配。
内容的提问来源于stack exchange,提问作者Alex Dalzoto
相关产品推荐
相关产品推荐

