正则表达式:查找大于特定值的数字(具有不同的小数位数)

3

我正在尝试使用正则表达式查找列表中所有大于或等于0.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])$

谢谢。


1
我看到你的正则表达式与 ^0?\.[0-9][3-9]\d{9,11}$ 相同。 - revo
3个回答

1

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

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

这样做的额外好处是可以精确匹配到小数点后100位左右的数字,比如精确匹配到0.03。
如果您想要严格控制小数点后的位数,可以使用花括号语法,它可以匹配9到15个数字之间的任何重复出现。
^(?:0?\.\d[3-9]\d{9,15})$

请注意,如此编写的正则表达式不匹配大于或等于0.03的任何内容--它匹配大于或等于0.03且小于1的任何内容,并且不匹配例如0.1这样大于0.03的内容。如果要匹配大于0.03的任何内容,最好完全跳过正则表达式并解析数字。

谢谢您的回复!不好意思,我有点困惑最后一句话——如果它匹配大于0.03和小于1的所有内容,为什么它就不匹配0.01? - user3682157
因为\.\d[3-9]不是可选的,所以它不会匹配0.1,因为该字符串未通过[3-9]字符。 - ggorlen

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

0

这里是结果:0.030000000 - 0.999999999999999

大于等于0.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})


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接