正则表达式:查找大于特定值的数字(十进制长度可变)

时间:2019-03-27 22:05:53

标签: python regex

我试图正则表达式查找列表中大于或等于.03的所有值。棘手的部分是我的值在9到15个小数位之间。

我当前的代码有些奏效,但是笨拙-任何建议都值得赞赏:

^(?:0?\.[0-9][3-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]|0?\.[0-9][3-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]|0?\.[0-9][3-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9])$

谢谢。

3 个答案:

答案 0 :(得分:1)

您可以使用星号表示零个或多个数字:

^(?:0?\.\d[3-9]\d*)$

这具有额外的好处,即完全匹配0.03或具有(例如)100个小数位的内容。

如果要严格限制小数位数,可以使用大括号语法,该语法匹配9到15位数字之间的任何重复:

^(?:0?\.\d[3-9]\d{9,15})$

请注意,按照书面规定,此正则表达式不匹配大于或等于0.03的任何内容-它匹配大于或等于0.03且小于1的任何内容,并且不匹配(例如0.1),即大于0.03。要匹配大于0.03的任何值,最好完全跳过正则表达式并解析数字。

答案 1 :(得分:0)

您应该将数据解析为float

从您的模式中,您似乎已经很好地分隔了数字-为什么要完全使用正则表达式?您的数字填满了整行或根本不匹配(r"^........$",因此本质上您具有:

t = """0.0000002
0.4
0.04
0.004
24544.23354
Also Bad"""

简单地分成几行,并检查每行是否为浮动

# splits the string into a list of lines
for line in (x.strip() for x in t.split("\n")):
    try:
        if float(line) >= 0.03:
            print(line)
        else: 
            print("Not ok:",line)
    except:
        print("Not ok:",line)

输出:

Not ok: 0.0000002
0.4
0.04
Not ok: 0.004
24544.23354
Not ok: Also Bad

答案 2 :(得分:0)

您在这里:0.030000000-0.999999999999999

大于或等于.03且小于1.0
在小数点后9-15位

0?\.(?:03\d{7,13}|0[4-9]\d{7,13}|[1-9]\d{8,14})

扩展

 #  0.030000000  -  0.999999999999999
 0?
 \.
 (?:
      03 \d{7,13} 
   |  0 [4-9] \d{7,13} 
   |  [1-9] \d{8,14} 
 )

注意-这是机器生成的,可能会有些重叠。
示例:0?\.(?:0[3-9]\d{7,13}|[1-9]\d{8,14})