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

如何用正则表达式提取数字:非空格分隔合并,空格分隔则拆分

问题

需要从包含数字、字母和特殊字符的文本中提取数字,核心规则:

  • 被非空格字符分隔的数字需合并为一个完整数字
  • 被空格分隔的数字需作为独立数字提取

示例场景:

  • 输入 ds[44]%6c,预期提取结果:446
  • 输入 2021 ds[44]%6c,预期提取结果:2021、446

此前尝试正则表达式 (-?\d+),但无法实现数字间非空格字符的合并,也不能以空格为边界拆分数字组。

解决方案

核心思路

把文本按空格分割成独立片段,对每个片段内的所有数字字符(含可选负号)进行拼接,忽略片段内的非数字非空格字符;每个片段处理后的非空数字串就是最终提取结果。

实现方式

分步处理(以Python为例)

这种方式逻辑清晰,容易理解和调试:

import re

def extract_numbers(text):
    # 按空格分割文本片段
    segments = text.split()
    results = []
    for seg in segments:
        # 仅保留片段中的数字和开头的负号,移除其他所有字符
        cleaned = re.sub(r'(?<!^)-|[^\d-]', '', seg)
        if cleaned:  # 跳过无数字的片段
            results.append(cleaned)
    return results

# 测试示例
print(extract_numbers("ds[44]%6c"))  # 输出: ['446']
print(extract_numbers("2021 ds[44]%6c"))  # 输出: ['2021', '446']
print(extract_numbers("-12ab34 56xy-78"))  # 输出: ['-1234', '5678']

单正则匹配+后处理

如果想用正则直接匹配出每个空格分隔的块,再清理非数字字符:
使用正则表达式:

(?<!\S)(-?\S*?\d\S*)(?!\S)

匹配逻辑:

  • (?<!\S):匹配位置前为空格或文本开头
  • (-?\S*?\d\S*):捕获包含至少一个数字的非空格块,允许开头带负号
  • (?!\S):匹配位置后为空格或文本结尾

对每个捕获的块,再用re.sub(r'[^\d-]', '', match)清理掉非数字和非负号字符,即可得到目标数字串。

规则验证

  • 针对输入 ds[44]%6c:分割后仅一个片段,清理后得到446
  • 针对输入 2021 ds[44]%6c:分割为两个片段,分别清理得到2021和446,符合预期

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 08:45:37