Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要帮助了解如何在Python中使用不太复杂的正则表达式吗_Python_Regex - Fatal编程技术网

需要帮助了解如何在Python中使用不太复杂的正则表达式吗

需要帮助了解如何在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}

我正在努力学习更多关于正则表达式的知识,我相信下面有一个正则表达式可以发现在高达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的数字,但也会跟有无数的数字出现
最后,不应该有一个结束价


我试图理解这个神奇的东西,所以我希望除了一个更优雅的解决方案(如果可以更正的话)之外,还可以对我的正则表达式进行更正。

是否有嵌套的括号(您的正则表达式假设没有)?如果没有:

要验证美元金额部分,请执行以下操作:

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,]+\)

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

我发现在裁剪正则表达式时使用它非常有用。它可以向您展示