需要帮助了解如何在Python中使用不太复杂的正则表达式吗
我正在努力学习更多关于正则表达式的知识,我相信下面有一个正则表达式可以发现在高达9990亿的数字上有一个缺失的近似表达式。下面的一个我认为应该做同样的事情,但我没有得到类似的结果需要帮助了解如何在Python中使用不太复杂的正则表达式吗,python,regex,Python,Regex,我正在努力学习更多关于正则表达式的知识,我相信下面有一个正则表达式可以发现在高达9990亿的数字上有一个缺失的近似表达式。下面的一个我认为应该做同样的事情,但我没有得到类似的结果 missingParenReg=re.compile(r"^\([$]*[0-9]{1,3}[,]?[0-9]{0,3}[,]?[0-9]{0,3}[,]?[0-9]{0,3}[.]*[0-9]*[^)]$") missingParenReg2=re.compile(r"^\([$]?([0-9]{1,3}
missingParenReg=re.compile(r"^\([$]*[0-9]{1,3}[,]?[0-9]{0,3}[,]?[0-9]{0,3}[,]?[0-9]{0,3}[.]*[0-9]*[^)]$")
missingParenReg2=re.compile(r"^\([$]?([0-9]{1,3}[,]?)+[.]*[0-9]*[^)]$")
我认为第二条说:
必须有一个打开的paren才能开始可能有也可能没有多达一个美元符号
下一个组必须至少存在一次,但可以存在无限次
组应至少有一个数字,但最多可以有三个
该组可以有多达0个逗号,也可以有多达1个逗号
该组后面可能有小数点,也可能没有小数点
如果有一个小数点,它后面将跟有多达0的数字,但也会跟有无数的数字出现
最后,不应该有一个结束价
我试图理解这个神奇的东西,所以我希望除了一个更优雅的解决方案(如果可以更正的话)之外,还可以对我的正则表达式进行更正。是否有嵌套的括号(您的正则表达式假设没有)?如果没有: 要验证美元金额部分,请执行以下操作:
import re
cents = r"(?:\.\d\d)" # cents
re_dollar_amount = re.compile(r"""(?x)
^ # match at the very begining of the string
\$? # optional dollar sign
(?: # followed by
(?: # integer part
0 # zero
| # or
[1-9]\d{,2} # 1 to 3 digits (no leading zero)
(?: # followed by
(?:,\d{3})* # zero or more three-digits groups with commas
| # or
\d* # zero or more digits without commas (no leading zero)
)
)
(?:\.|%(cents)s)? # optional f.p. part
| # or
%(cents)s # pure f.p. '$.01'
)
$ # match end of string
""" % vars())
允许:
$0
0
$234
22
$0.01
10000.12
$99.90
2,010,123
1.00
2,103.45
$.10
$1.
$0
0
$234
22
$0.01
10000.12
$99.90
2,010,123
1
2,103.45
$.10
$1.
禁止:
01234
00
123.4X
1.001
.
01234
00
123.4X
1.001
.
是否有嵌套的括号(您的正则表达式假定没有)?如果没有: 要验证美元金额部分,请执行以下操作:
import re
cents = r"(?:\.\d\d)" # cents
re_dollar_amount = re.compile(r"""(?x)
^ # match at the very begining of the string
\$? # optional dollar sign
(?: # followed by
(?: # integer part
0 # zero
| # or
[1-9]\d{,2} # 1 to 3 digits (no leading zero)
(?: # followed by
(?:,\d{3})* # zero or more three-digits groups with commas
| # or
\d* # zero or more digits without commas (no leading zero)
)
)
(?:\.|%(cents)s)? # optional f.p. part
| # or
%(cents)s # pure f.p. '$.01'
)
$ # match end of string
""" % vars())
允许:
$0
0
$234
22
$0.01
10000.12
$99.90
2,010,123
1.00
2,103.45
$.10
$1.
$0
0
$234
22
$0.01
10000.12
$99.90
2,010,123
1
2,103.45
$.10
$1.
禁止:
01234
00
123.4X
1.001
.
01234
00
123.4X
1.001
.
我一眼就能看出的一个区别是,您的正则表达式不会找到如下字符串:
(123,,,
这是因为更正后的版本要求逗号之间至少有一位数字。(我认为这是一个合理的要求。)我一眼就能看出的一个区别是,您的正则表达式不会找到如下字符串:
(123,,,
这是因为更正后的版本要求逗号之间至少有一位数字。(我认为这是一个合理的要求。)正则表达式更棘手的部分不是让它们接受有效的输入,而是让它们拒绝无效的输入。例如,第二个表达式接受明显错误的输入,包括:
——每个逗号之间有一位数字(1,2,3,4
——每个逗号之间有两位数字(12,34,56
——小数点数量不限(1234……5
——小数点前的逗号(1234.5
——如果有一些逗号,它们应该在每个三元组之间(123456789012
——前导零不是常规(01234
——最后一个字符不是结束符(123.4X
[-+]?[$]?(0 |[1-9]\d*|[1-9]\d{0,2}(,\d{3})*)(\.\d+)
- 可选的前导加号/减号
- 可选的美元符号
- 由
分隔的三个选项:|
- 单个零位数(对于0.5或仅0这样的数字)
- 不带逗号的任意位数。第一个数字不能为零
- 逗号分隔的数字。第一个数字不得为零。第一个逗号前最多三位。每个逗号后面必须紧跟三位数字
- 可选的单小数点,后面必须跟一个或多个数字
(?!…)
如果输入与内部正则表达式不匹配,则计算为匹配的构造
(?!\([$\d,]+\)
正则表达式更棘手的部分不是让它们接受有效输入,而是让它们拒绝无效输入。例如,第二个表达式接受明显错误的输入,包括:
——每个逗号之间有一位数字(1,2,3,4
——每个逗号之间有两位数字(12,34,56
——小数点数量不限(1234……5
——小数点前的逗号(1234.5
——如果有一些逗号,它们应该在每个三元组之间(123456789012
——前导零不是常规(01234
——最后一个字符不是结束符(123.4X
[-+]?[$]?(0 |[1-9]\d*|[1-9]\d{0,2}(,\d{3})*)(\.\d+)
- 可选的前导加号/减号
- 可选的美元符号
- 由
分隔的三个选项:|
- 单个零位数(对于0.5或仅0这样的数字)
- 不带逗号的任意位数。第一个数字不能为零
- 逗号分隔的数字。第一个数字不得为零。第一个逗号前最多三位。每个逗号后面必须紧跟三位数字
- 可选的单小数点,后面必须跟一个或多个数字
(?!…)
如果输入与内部正则表达式不匹配,则计算为匹配的构造
(?!\([$\d,]+\)
我发现在裁剪正则表达式时使用它非常有用。它可以直观地显示正则表达式的运行情况。它可以节省大量时间。我发现在裁剪正则表达式时使用它非常有用。它可以向您展示