我试图用以下格式捕获所有数字:
- 长度为1-5(不能超过!)但不以0开头的数字
- 下一个是
.
或,
- 接下来是长度为2-3的数字
- 可选转
,
- 可选数字
我有以下正则表达式:(?<!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.2011
和07.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.])
右端不是数字或者.
查看正则表达式演示。