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

如何用正则分割包含文本与带逗号数字的字符串?

正则实现文本与带格式数字的分离

你的问题出在原正则(\d+)只能匹配连续数字,会把数字里的逗号、小数点当成非数字内容拆分出来。要完整匹配带千分位逗号和小数点的数字,需要用更精准的正则表达式,这里推荐两种实现方式:

方法1:使用re.findall直接提取目标内容

这种方式更直观,直接匹配文本块和完整数字块:

import re

s = "Balance Quantity 430,000.00 Total Buy 380,000.00"
# 匹配:要么是由字母和空格组成的文本块,要么是带千分位的数字
pattern = r'(?:[A-Za-z]+\s*)+|\d{1,3}(?:,\d{3})*\.\d+'
result = [item.strip() for item in re.findall(pattern, s)]
print(result)

输出结果:

["Balance Quantity","430,000.00","Total Buy","380,000.00"]

正则说明:

  • (?:[A-Za-z]+\s*)+:匹配一个或多个字母单词(中间可带空格),(?:...)是非捕获组,避免生成多余分组
  • \d{1,3}(?:,\d{3})*\.\d+:匹配带千分位的数字:
    • \d{1,3}:匹配开头1-3位数字
    • (?:,\d{3})*:匹配零个或多个「逗号+3位数字」的千分位结构
    • \.\d+:匹配小数点后至少一位数字

方法2:使用re.split分割字符串

如果想用split实现,需要以「数字前的空格」或「数字后的空格」作为分割点,同时保留数字内容:

import re

s = "Balance Quantity 430,000.00 Total Buy 380,000.00"
# 分割规则:要么在数字前的空格处分割(捕获数字),要么在数字后的空格处分割
pattern = r'\s+(?=(\d{1,3}(?:,\d{3})*\.\d+))|\s+(?<=\d{1,3}(?:,\d{3})*\.\d+)\s+'
result = [item for item in re.split(pattern, s) if item]
print(result)

输出结果和方法1一致。

正则说明:

  • \s+(?=(\d{1,3}(?:,\d{3})*\.\d+)):正向预查,匹配数字前的空格,同时捕获数字作为分割结果的一部分
  • \s+(?<=\d{1,3}(?:,\d{3})*\.\d+)\s+:反向预查,匹配数字后的空格,分割出后续文本块
  • if item:过滤split操作产生的空字符串

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 12:03:19