首页 > 解决方案 > 前面没有字符串的双小数位数(可能为负数)的 Python 正则表达式

问题描述

因此,我正在尝试开发一个 python 正则表达式,它可以捕获一个精确的双小数位数字,该数字前面没有特定的字符串:“JPY”。这里有些例子:

火柴:

不匹配项(可能存在):

我有这样的表达:(-?\d+\.\d\d(?!\d))。基本上它通过匹配一个字符串来工作:

  1. 可选地以否定开头:-?
  2. 至少包含一位数字:\d+
  3. 然后是小数位期间:\.
  4. 然后正好是两个数字:\d\d
  5. 如果您发现后面还有更多数字,请忽略该匹配项(?!\d)

但是,一旦我想在后视中添加货币负数,它就失败了:(?<!JPY )(-?\d+\.\d\d(?!\d)).

发生这种情况的原因对我来说有点道理,但我仍然不喜欢它。基本上,对于像: 这样的字符串JPY 1600.00,它最终会丢弃JPY 1并考虑600.00匹配。但问题是,这没有任何意义。1由于前面的 . 不是要丢弃的有效匹配JPY 。那么发生了什么?


有趣的是,这个网站是“Negative Lookbehind”的第二个谷歌结果,有这个完全相同的例子,但他们不使用匹配组。我需要匹配组,因为我正在尝试提取数字。


丢弃整个匹配的相同逻辑适用于前瞻(上面的#5),但不适用于这种后瞻。为什么?我试过在匹配组内外移动它,但没有任何效果。

这似乎只是一个要修复的小错误,但我很累,我尝试了很多变化,但没有任何效果。任何指导表示赞赏!


@AlexanderMashin 的完整解决方案(有效):

((?<!JPY )(?<!\d)-?\d+\.\d\d(?!\d))

标签: pythonregex

解决方案


添加另外两个否定的后向断言:(?<!\d)(?<!-)https://regex101.com/r/kiFIPx/1 ( (?<!JPY )(?<!\d)(?<!-)(-?\d+\.\d\d(?!\d)))。

第一个断言(?<!\d)将确保匹配的数字之前没有数字。第二个断言将(?<!-)阻止10000.12.JPY -10000.12


推荐阅读