【问题标题】:Python re: How to match any numbers even those with comma & decimal?Python re:如何匹配任何数字,即使是逗号和小数点?
【发布时间】:2021-10-17 13:09:08
【问题描述】:

我想匹配任何可能包含小数、逗号或整数的数字。我尝试了以下方法,但如果数字有 > 2 个逗号,我的正则表达式将无法匹配。

谢谢

import re

string1= "6,111,123,999 5,450,900 10.32 OCT21  Dec 31, 2019"

num=re.findall(r'\b\d+[.,]*\d+[,]*d*\b', string1)

Result:

['6,111,123', '999', '5,450,900', '10.32', '31', '2019']

Desired Outcome --> ['6,111,123,999', '5,450,900', '10.32', '31', '2019']

【问题讨论】:

  • 试试[\d.,]+ ...
  • 这个正则表达式正在工作([0-9,.]+),但我无法在 31 岁后让, 无法捕捉
  • 匹配任何由数字、逗号和点组成的字符串,并使用前瞻来确保它至少包含一个数字。或者,如果合适的话,写成它以一个数字开头,然后是数字、逗号或点,最后是一个数字。
  • @GhostOps 这也将匹配,,..,,,.

标签: python python-re


【解决方案1】:

匹配所有数字

你可以使用\d(?:[\d,.]*\d+)?

string1= "6,111,123,999 5,450,900 10.32 OCT21  Dec 31, 2019 1"

import re
re.findall(r'\d(?:[\d,.]*\d+)?', string1)

输出:['6,111,123,999', '5,450,900', '10.32', '21', '31', '2019', '1']

只匹配独立单词的数字

使用\b[\d,.]*\d+\b

string1= "6,111,123,999 5,450,900 10.32 OCT21  Dec 31, 2019 1"

import re
re.findall(r'\b[\d,.]*\d+\b', string1)

输出:['6,111,123,999', '5,450,900', '10.32', '31', '2019', '1']

编辑:仅匹配空格、字符串结尾或逗号作为分隔符
string1= "6,111,123,999 5,450,900 10.32 1a2 1-2 OCT21  Dec 31, 2019 1"

import re
re.findall(r'(?:(?<=^)|(?<=\s))[\d,.]*\d+(?=$|\s|,)', string1)

输出:['6,111,123,999', '5,450,900', '10.32', '31', '2019', '1']

【讨论】:

  • 非常感谢! \b[\d,.]*\d+\b 有效,除非数字之间有破折号,如 1-2。该模式提取“1”和“2”。我该如何解决这个问题?谢谢!
  • @Peter 检查更新,但现在您必须手动处理您想要或不想要的分隔符
【解决方案2】:

这将是我对您想要的结果的快速修复,它混合了正则表达式(我发现它会产生很多代码噪音)和一些简单的对象操作。总体上不是很漂亮,但确实如此:

import re

string_one = "6,111,123,999 5,450,900 10.32 OCT21  Dec 31, 2019"

num=[re.findall(r'^[0-9,.]+', el.rstrip(',')) for el in string_one.split()]

# give a proper result
result = [item for sublist in num for item in sublist]

print(result)
# ['6,111,123,999', '5,450,900', '10.32', '31', '2019']

【讨论】:

    【解决方案3】:

    试试(?:[\d]+[.,]?\b)+

    它匹配任何可能有小数、逗号或整数的数字

    代码:

    import re
    
    string1= "6,111,123,999 5,450,900 10.32 OCT21  Dec 31, 2019"
    num = re.findall(r'(?:\b[\d]+[.,]?\b)+', string1)
    
    print(num)
    

    输出:

    ['6,111,123,999', '5,450,900', '10.32', '31', '2019']
    

    Regex101 Demo

    告诉我是否适合你...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多