正则表达式提取带小数的多个数字
Posted
技术标签:
【中文标题】正则表达式提取带小数的多个数字【英文标题】:Regex to extract multiple numbers with decimal 【发布时间】:2022-01-18 02:12:40 【问题描述】:我有以下一组数字:
SalesCost% Margin
2,836,433.182,201,355.6422.39
预期结果:
我想将其分开并提取数字,以便得到如下所示的结果:
2,836,433.18
2,201,355.64
22.39
尝试
我尝试了(\d+)(?:\.(\d1,2))?
正则表达式,但这只会提取到第一个小数点的数字,即我只得到2,836,433.18
。
问题
有没有一种方法可以使用正则表达式(或者通过 Python)提取数字以获得上面显示的结果?
【问题讨论】:
【参考方案1】:你可以使用
re.findall(r'\d1,3(?:,\d3)*(?:\.\d1,2)?', text)
re.findall(r'(?:\d1,3(?:,\d3)*|\d+)(?:\.\d1,2)?', text)
参见regex demo #1 和regex demo #2。
详情:
\d1,3
- 一位、两位或三位数字
(?:,\d3)*
- 零次或多次出现逗号和三位数字
(?:\.\d1,2)?
- .
和一个或两个数字的可选序列。
(?:\d1,3(?:,\d3)*|\d+)(?:\.\d1,2)?
变体支持像 123456.12
这样的数字,即没有包含整数部分的数字分组符号。
【讨论】:
亲爱的Wiktor,请问这里使用非捕获组的目的是什么? @AnoushiravanR 由于re.findall
返回(列表)元组,如果正则表达式模式包含捕获组(组),非捕获组是解决此问题的常用方法。见re.findall behaves weird。你可能也对R's equivalent of Python's re.findall感兴趣。以上是关于正则表达式提取带小数的多个数字的主要内容,如果未能解决你的问题,请参考以下文章