簡體   English   中英

正則表達式在不同長度的空格后捕獲數字

[英]regex capture numbers after varied lengths of spaces

我嘗試使用一個非捕獲組來檢測空格(在我需要的數字之前),而不是在結果中加入空格,因此我使用

(?: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'>

您當前的正則表達式基本上是一個大字符集

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

沒什么意義,似乎是對正則表達式工作原理的誤解。 如果要匹配數字,則往后看幾個空格,匹配數字和句點,然后再看另外兩個空格可能更有意義:

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

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

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

您的正則表達式[(?: 1+)\\d*\\.?\\d*][1]包含或是字符類的 2倍。

如果您要匹配的數字始終包含一個點,則可以使用單詞邊界和正向前瞻來斷言其后是空白:

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

如果也可能沒有點,則可以使用lookrounds檢查前導空格和尾隨空格,並使與點和一個或多個倍數匹配的部分為可選(?:\\.\\d+)?

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

演示

嘗試正則表達式\\b(\\d+[\\d\\.]*)\\b

您的正則表達式與您要執行的操作不一致。這是非常錯誤的。

嘗試以下模式: +(\\d+(\\.\\d+)?) +

說明:pattern將匹配前面的數字,后跟一個或多個空格( + )。 它將匹配具有可選小數部分( (\\.\\d+)? )的數字,這將成為匹配項中的第二個捕獲組(但無論如何您都不需要它)。

在每場比賽中,第一個捕獲組\\1將是您的號碼。

演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM