"Python中如何使用更简单的正则表达式的帮助指南"

2024-10-03 23:28:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试了解更多关于正则表达式的知识,我相信下面的一个表达式可以发现在一个高达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}[,]?)+[.]*[0-9]*[^)]$")

我想第二个是说: 必须有一个开放的paren开始
可能有或可能没有一个美元符号
下一个组必须至少存在一次,但可以无限次存在
该组应至少有一个数字,但可以有多达三个
组中的逗号可能只有0个,最多可以有1个
在这一组后面可能有小数点,也可能没有小数点
如果有一个小数点,它后面最多会有0个,但也会有很多未计算的位数
最后不应该有一个收尾计划。在

我正在努力理解这个神奇的东西,所以我会很感激我的正则表达式的更正(如果它可以纠正)除了一个更优雅的解决方案,如果你有它。在


Tags: re表达式符号数字解决方案计划逗号compile
3条回答

我发现在裁剪regex时使用kiki非常有用。它可以直观地显示正则表达式的运行情况。这是一个巨大的节省时间。在

正则表达式更棘手的部分不是让它们接受有效的输入,而是让它们拒绝无效的输入。例如,第二个表达式接受明显错误的输入,包括:

  • (1,2,3,4——每个逗号之间有一个数字
  • (12,34,56——每个逗号之间有两个数字
  • (1234......5——小数点数目不限
  • (1234,.5——小数点前有逗号
  • (123,456789,012——如果有一些逗号,它们应该在每个三元组之间
  • (01234——前导零不是常规的
  • (123.4X——最后一个字符不是结束符

下面是一个替代正则表达式,它应该拒绝上面的示例:

[-+]?[$]?(0|[1-9]\d*|[1-9]\d{0,2}(,\d{3})*)(\.\d+)?

  • 可选前导加号/减号。在
  • 可选美元符号。在
  • |分隔的三个选项:
    • 一个零位数(对于0.5或简单的0)。在
    • 不带逗号的任意位数。第一个数字不能为零。在
    • 逗号分隔的数字。第一个数字不能为零。第一个逗号前最多三位数字。每个逗号后面必须紧跟三位数字。在
  • 可选的一个小数点,后面必须跟一个或多个数字。在

关于parens,如果您只关心paren是否平衡,那么您可以忽略精确解析出数字格式;只需相信paren之间的任何数字、小数点和逗号的组合都是有效的。然后使用(?!...)构造,如果输入的与内部的正则表达式不匹配,则该构造的计算结果为匹配。在

(?!\([$\d.,]+\))

是否有嵌套的括号(您的regexp假定没有嵌套的圆括号)?如果没有:

whether_paren_is_missing = (astring[0] == '(' and not astring[-1] == ')')

要验证美元金额部分:

^{pr2}$

允许:

    $0
    0
    $234
    22
    $0.01
    10000.12
    $99.90
    2,010,123
    1.00
    2,103.45
    $.10
    $1.

禁止:

    01234
    00
    123.4X
    1.001
    .

相关问题 更多 >