python - 前面没有字符串的双小数位数(可能为负数)的 Python 正则表达式
问题描述
因此,我正在尝试开发一个 python 正则表达式,它可以捕获一个精确的双小数位数字,该数字前面没有特定的字符串:“JPY”。这里有些例子:
火柴:
100.00
12.00
2.30
-10000.12
不匹配项(可能存在):
- 2.01212331
- 123.00 日元
- 10000.12 日元
我有这样的表达:(-?\d+\.\d\d(?!\d))
。基本上它通过匹配一个字符串来工作:
- 可选地以否定开头:
-?
- 至少包含一位数字:
\d+
- 然后是小数位期间:
\.
- 然后正好是两个数字:
\d\d
- 如果您发现后面还有更多数字,请忽略该匹配项
(?!\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))
解决方案
添加另外两个否定的后向断言:(?<!\d)(?<!-)
如https://regex101.com/r/kiFIPx/1 ( (?<!JPY )(?<!\d)(?<!-)(-?\d+\.\d\d(?!\d))
)。
第一个断言(?<!\d)
将确保匹配的数字之前没有数字。第二个断言将(?<!-)
阻止10000.12
.JPY -10000.12
推荐阅读
- java - 以编程方式读取属性文件时,Log4J2 不记录任何内容
- android - 移动到另一个活动并返回时如何保存活动状态?
- reactjs - React JS 导入 css 文件有表达式 no-unused-expressions
- sql-server - 过程或函数“SlctNxtPrv”需要参数“@PRV”,但未提供?
- python - Django选择与条件间接相关
- c# - 希望随机化不同的可能输出
- c++ - IBM MQ 8.0.0.x C++ 包括
- python - 如何从 OpenCV、python 3 获取图像原始字节?
- python-3.x - Pipenv 安装的 git 包不可导入
- reactjs - 反应中的多文件上传