Regex捕获的数字比我定义的多.错误的解释



我试图用以下格式捕获所有数字:

  1. 长度为1-5(不能超过!)但不以0开头的数字
  2. 下一个是.,
  3. 接下来是长度为2-3的数字
  4. 可选转,
  5. 可选数字

我有以下正则表达式:(?<!d)[d]{1,5}(?!d)[.,][d]{2,3}[,]*[d]*

,它应该匹配:

7,93
8.32
20,43
100.23
2.800
1.597,72
2.026,88
33.000
33.000,43
100.000
150,000
150.000,50

where it不应该匹配:

7.3.2011 
07.03.2011
3.2011

我用下面的示例字符串测试了我的正则表达式:

7.3.2011  zwischen 7,93 und 10,53 EUR Dienstbeginn: 07.03.2011 

或在代码中:

import re
string = '7.3.2011  zwischen 7,93 und 10,53 EUR Dienstbeginn: 07.03.2011'
salary = r"(?<!d)[d]{1,5}(?!d)[.,][d]{2,3}[,]*[d]*" 
print(re.findall(salary, string))

不幸的是,它匹配3.201107.03。我不明白为什么它匹配3.2011?我定义,在第一个.之后,它应该匹配2-3个数字,但它匹配4。它也不应该匹配07.03,因为07.03.2011有错误的格式(我不想匹配)

你能解释一下我做错了什么吗?你能纠正我的错误吗?

可以在左右两边排除匹配的数字和逗号,也可以选择匹配逗号后面跟着1个或多个数字。

请注意,[d]*本身不必放在方括号之间。

(?<![d.])d{1,5}[.,]d{2,3}(?:,d+)?(?![d.])

  • (?<![d.])左端不能为数字或.
  • d{1,5}匹配1-5位数字
  • [.,]d{2,3}匹配.,, 2-3位
  • (?:,d+)?可选匹配,和1+数字
  • (?![d.])右端不是数字或者.

查看正则表达式演示。

最新更新