【问题标题】:Regular expression - number with spaces and decimal comma正则表达式 - 带空格和小数逗号的数字
【发布时间】:2014-10-24 08:11:30
【问题描述】:

我想在 Pyhton 中为以下类型的字符串编写一个正则表达式:

1100

1 567 865

1 474 388 346

即数字与千分开。这是我的正则表达式:

r"(\d{1,3}(?:\s*\d{3})*)

而且效果很好。但是,我也想解析

1 100,34848

1 100 300,8

19 328 383 334,23499

即用十进制数字分隔数字。我写了

rr=r"(\d{1,3}(?:\s*\d{3})*)(,\d+)?\s

它不起作用。例如,如果我制作

sentence = "jsjs 2 222,11 dhd"

re.findall(rr, 句子)

[('2 222', ',11')]

任何帮助表示赞赏,谢谢。

【问题讨论】:

  • 如果这不是您想要的输出,您想要什么输出做了?因为这似乎正是您应该寻找的(除了可能将 , 移出捕获组之外)。
  • 我得到了两个令牌,“2 222”和“,11”。答案应该是“2 222,11”。:)
  • 请将其编辑到您的问题中,而不仅仅是在评论中。就目前而言,您的问题(如果人们正在寻找帮助或寻求类似问题的帮助,这是人们唯一会看到的问题)并没有明确您的要求。

标签: python regex python-2.7


【解决方案1】:

这行得通:

import re

rr=r"(\d{1,3}(?:\s*\d{3})*(?:,\d+)?)"
sentence = "jsjs 2 222,11 dhd"

print re.findall(rr, sentence) # prints ['2 222,11']

【讨论】:

    【解决方案2】:

    TL;DR:这个正则表达式将打印['2 222,11 ']

    r"(?:\d{1,3}(?:\s*\d{3})*)(?:,\d+)?"
    

    搜索的结果是括号中的表达式,但以 (?: 开头的表达式除外,如果不是任何子表达式,则为整个表达式

    因此,在您的第一个正则表达式中,它将匹配您的字符串并返回整个表达式,因为没有子表达式(唯一的双亲以 (?: 开头)

    第二个它将找到字符串2 222,11并匹配它,然后它查看子表达式((\d{1,3}(?:\s*\d{3})*)(,\d+),并将返回包含这些的元组:即小数点逗号之前的部分,以及之后的部分

    因此,要修复您的表达式,您需要添加到所有括号 ?: 或删除它们

    最后一个\s 也是多余的,因为正则表达式总是匹配尽可能多的字符——这意味着它将匹配逗号后的所有数字

    【讨论】:

      【解决方案3】:

      您的结果的唯一问题是您得到两个匹配组而不是一个。发生这种情况的唯一原因是您正在创建两个捕获组而不是一个。你在前半部分和后半部分放置单独的括号,这就是括号的含义。只是不要那样做,你就不会有这个问题。

      所以,有了这个,你就成功了一半:

      (\d{1,3}(?:\s*\d{3})*,\d+)\s
      

      Debuggex Demo

      唯一的问题是,\d+ 部分现在是强制而不是可选的。您显然需要在某个地方放置?,就像您正在做的那样。但是没有组,你怎么做呢?很简单:您可以使用组,只需将其设为非捕获组((?:…) 而不是(…))。并将其放在主捕获组中,而不是与它分开。正如您已经为重复的 \s*\d{3} 部分所做的那样。

      (\d{1,3}(?:\s*\d{3})*(?:,\d+)?)\s
      

      Debuggex Demo

      【讨论】:

      • 非常感谢您的解释,非常有帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-02
      • 2021-11-09
      相关资源
      最近更新 更多