【问题标题】:Regex to match the number zero正则表达式匹配数字零
【发布时间】:2016-05-05 08:16:17
【问题描述】:

我需要一个正则表达式,它将匹配数字零的十进制形式,例如 0 或 0.0 或 0.00000,但不匹配 10 的倍数,例如 110.0000

我已经看到this SO 问题,它并不真正匹配。

我一直在使用出色的在线正则表达式工具 here 来测试模式,但收效甚微。

我能想到的最好的方法是(\b0+(\.)?0+\b) 不幸的是,正则表达式将. 视为单词边界,因此它最终会捕获25.000 中的.000。删除我的 ? 可以解决这个问题,但会错过任何孤立的单个 0 字符

【问题讨论】:

  • 了解您正在使用哪种正则表达式方言会影响此答案。以防万一,您应该始终使用正则表达式方言进行标记(您永远不知道它何时相关)
  • 如果有帮助,我正在使用 python 2.7 中内置的正则表达式。我不确定“方言”或如何确定它们或在测试站点上应用它们。
  • 用“regexpython”标记就足够了。

标签: python regex python-2.7


【解决方案1】:

也许这会有所帮助:

在您指向的正则表达式工具站点上,此表达式:

((!(\d+0\.0*))|(\d*[^0]\.0*)|([^\d]0\.0)|([^\d]0\.)|(^0))

解释:

!(\d+0\.0*)    => does not match digits ends with 0 following by a dot and zeros
(\d*[^0]\.0*)  => match digits that not have a zero before the dot, following by zeros
([^\d]0\.0)    => match 0.0 that having no digits before the first zero
([^\d]0\.)     => match 0. that having no digits before the first zero
(^0)           => math a zero on the starts of the line

结果:

0              <- match
0.0            <- match
25.00000       <- match
10.00000       <- does not match
110.0000       <- does not match
2818.0000      <- match
120901821.000  <- match
0.             <- match

【讨论】:

    【解决方案2】:

    这种模式很快就变得丑陋了:

    (?:^|[^.\d])(0?\.0+|0)(?:[^.\d]|$)
    

    (?:^|[^.\d]) 不匹配的任何非数字或句点但可以作为行首的组

    (0?\.0+|0) 匹配组以匹配浮点数或整数零

    (?:[^.\d]|$) 非数字或句点但可以是行尾的任何内容的不匹配组

    应该处理明显的情况,即使是他们自己。应该在上下文中处理零,例如“0.0in”或坐标“(34.8,0.0)”目前在“0”上搞砸了。

    【讨论】:

      【解决方案3】:
      (?<![\d.])0+(?:\.0+)?(?![\d.])
      

      前面没有数字或小数点;然后是任意数量的零,可选地后跟一个小数点和任意数量的零;并且后面没有数字或小数点。

      但是,这在没有后视的引擎(如 JavaScript 的引擎)中不起作用。

      【讨论】:

      • 错过0. 这不是破坏交易,只是评论。
      • @MrPurple:考虑到这个问题,我并不认为这是一种要寻找的模式。但实际上,它与0. 不匹配。
      • +1 因为这对我有用,我很欣赏这个解释。另请注意,它确实捕获了00,这对我来说可以,但对其他人来说可能不行。
      【解决方案4】:
      (?:^|[ ])0+(?:\.0+)?(?:[ ]|$)
      

      如果您需要检索零的确切文本,只需将其包裹在括号中即可匹配。将您想要的任何其他字符添加到大括号或替换为 \s[:[space]:] 等类(或者以您的语言表示)

      【讨论】:

      • 不匹配“0.”也不匹配“.0”,这些形式有意义吗?
      • 如果他想要那些东西,把里面改成(0+(?:\.0*)?|\.0+)
      【解决方案5】:
      (?<!\.)\b0(?:\.0+)?(?!\.)\b
      

      试试这个。查看演示。

      https://regex101.com/r/cZ0sD2/13

      【讨论】:

      • 嘿! regex101 很好。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-08
      • 1970-01-01
      • 2014-03-05
      • 1970-01-01
      • 2014-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多