正则表达式在不同长度的空格后捕获数字

时间:2018-08-06 05:54:55

标签: python regex

我尝试使用一个非捕获组来检测空格(在我需要的数字之前),而不是在结果中加入空格,所以我使用

(?: 1 +)\ d *。?\ d *

处理我的文字:

 input: kMPCV/epS4SgFoNdLo3LOuClO/URXS/5         134.686356921  2018-06-14 21:50:35.494
 input: pRVh7kPpFbtmuwS1NILiCzwHUVwJ4NcK         839.680408921  2018-06-14 22:13:39.996
 input: Ga7MIXmXAsrbaEc1Yj60qYYblcRQpnpz         4859.688276920  2018-06-14 23:02:11.125
 input: 4mqdb5njytfDOFpgeG3XS0Iv1OXFPEnb        1400.684675920  2018-06-14 23:33:42.031

并尝试获取数字。

但是第2行和第3行返回无结果,第1行和第4行返回前有1个空格的数字:“ 134.686356921”

为什么我得到不同的结果?代码如下:

import re
def calcprice(filename):

    try:
        print ('ok')
        f = open(filename, 'r')
        data = f.read()
        rows = data.split('\n')

        for row in rows:
            print (re.search("[(?: 1+)\d*\.?\d*][1]",row))


    except Exception as e:
        print(e)


if __name__ == "__main__": ## If we are not importing this:
    calcprice('dfk balance.txt')

结果:

<_ sre.SRE_Match对象; span =(52,66),match ='134.686356921'>

没有

没有

<_ sre.SRE_Match对象; span =(51,66),match ='1400.684675920'>

4 个答案:

答案 0 :(得分:0)

您当前的正则表达式基本上是一个大字符集:

[(?: 1+)\d*\.?\d*]

没什么意义,似乎对正则表达式的工作方式有误解。如果您想匹配数字,那么往后看几个空格,匹配数字和句点,然后再看另外两个空格可能更有意义:

(?<=  )[\d.]+(?=  )

https://regex101.com/r/NRnXWb/1

for row in rows:
    print (re.search(r"(?<=  )[\d.]+(?=  )",row))

答案 1 :(得分:0)

您的正则表达式[(?: 1+)\d*\.?\d*][1]character class的2倍。

如果要匹配的数字始终包含一个点,则可以使用word boundary和正数lookahead来断言其后是空白:

\b\d+\.\d+(?= )

如果它也可以不带点,则可以使用lookrounds来检查前导空格和尾随空格,并使与点和一个或多个数字匹配的部分为可选(?:\.\d+)?

(?<= )\d+(?:\.\d+)?(?= )

Demo

答案 2 :(得分:0)

尝试使用正则表达式\b(\d+[\d\.]*)\b

您的正则表达式与您要执行的操作不一致。这是非常错误的。

答案 3 :(得分:0)

尝试以下模式:+(\d+(\.\d+)?) +

说明:模式将匹配前面的数字,后跟一个或多个空格(+)。它将匹配具有可选小数部分((\.\d+)?)的数字,这将成为匹配项中的第二个捕获组(但是无论如何您都不需要它)。

在每次比赛中,第一个捕获组\1将是您的电话号码。

Demo