簡體   English   中英

python regex查找/匹配一個或多個字符串

[英]python regex find/match one or more in a string

我幾乎再也找不到搜索Google和此站點的解決方案。

我想從一個字符串中選擇兩個不同字符串的一個或多個序列:

例如'aSATMPA23.37aSAAWAKE----aSABATT2.05-aSASLEEPING-'

因此,我希望能夠選擇“ aSATMPA23.37”,如果還有的話,還可以選擇“ aSABATT2.05”。

我嘗試了以下方法:

import re
serialdata = 'aSATMPA18.5-----aSBBATT2.97-aSBSLEEPING-'
def regex_serialdata(data):                                   
    GrandRegex = re.compile(r'(aS(.)(TMPA)(\d+\.\d+))|(aS(.)(BATT)(\d+\.\d+))')
    match = GrandRegex.match(data)

但這僅在“ aSATMPA18.5”的第一場比賽后停止

接下來,我嘗試使用“ findall”方法:

def regex_serialdata(data):                                   
    GrandRegex = re.compile(r'(aS(.)(TMPA)(\d+\.\d+))|(aS(.)(BATT)(\d+\.\d+))')      
    match = GrandRegex.findall(data)
    print(match)

結果為: [('aSATMPA18.5', 'A', 'TMPA', '18.5', '', '', '', ''), ('', '', '', '', 'aSBBATT2.97', 'B', 'BATT', '2.97')]

有一個更好的方法嗎?

我可以輕松訪問元組列表中的值嗎?

請注意,我已經花了幾個小時在此上,不要輕易尋求幫助。

非常感激,

保羅

>>> a = 'aSATMPA23.37aSAAWAKE----aSATMPA15.14-aSASLEEPING-'
>>> re.findall(r'aSATMPA\d+.\d+',a)
['aSATMPA23.37', 'aSATMPA15.14']

如果按如下所示放置括號,則可以從每個匹配項中獲取具有所需值的元組列表:

>>> a
'aSATMPA23.37aSAAWAKE----aSBBATT2.05-aSASLEEPING-'
>>> b = re.findall(r'(aS)(ATMPA|BBATT)(\d+.\d+)',a)
>>> b
[('aS', 'ATMPA', '23.37'), ('aS', 'BBATT', '2.05')]
>>> b[0][0]
'aS'
>>> b[0][1]
'ATMPA'
>>> b[0][2]
'23.37'
>>> b[1][0]
'aS'
>>> b[1][1]
'BBATT'
>>> b[1][2]
'2.05'

有一個更好的方法嗎?

是。 擺脫所有括號:

import re
serialdata = 'aSATMPA18.5-----aSBBATT2.97-aSBSLEEPING-'
def regex_serialdata(data):
    GrandRegex = re.compile(r'aS.TMPA\d+\.\d+|aS.BATT\d+\.\d+')
    match = GrandRegex.findall(data)
    print (match)

regex_serialdata(serialdata)

我可以輕松訪問元組列表中的值嗎?

是。 從第二個示例,嘗試print(match[0][0], match[1][4])

嘗試使用以下正則表達式:

r'(aSA(?:TMPA|BATT))(\d+(?:\.\d+)?)'

完整代碼:

import re
p = re.compile(r'(aSA(?:TMPA|BATT))(\d+(?:\.\d+)?)', re.DOTALL)

test_str = """
aSATMPA23.37aSAAWAKE----aSABATT2.05-aSASLEEPING-aSATMPA23.37aSAAWAKE--
--aSABATT2.05-aSASLEEPING-aSATMPA23.37aSAAWAKE---
-aSABATT2.05-aSASLEEPING-aSATMPA23.37aSAAWAKE-
"""

for m in re.finditer(p, test_str):
    print('{0:<15}{1}'.format(m.group(1), m.group(2)))

它將打印:

aSATMPA        23.37
aSABATT        2.05
aSATMPA        23.37
aSABATT        2.05
aSATMPA        23.37
aSABATT        2.05
aSATMPA        23.37

觀看演示

根據您的輸入,它將捕獲

  • aSATMPA23.37
  • aSABATT2.05

感謝所有做出了貢獻的人,在您的幫助下,我提出了以下建議:

import re

serialdata = 'aSATMPA18.5-----aSBBATT2.97-aSBSLEEPING-'

def regex_serialdata(data):                                  
    GrandRegex = re.compile(r'aS(.)(TMPA|BATT)(\d+.\d+)')

    match = GrandRegex.findall(data)

    print(match)
for x, y, z in match:   
    if y == 'TMPA':
        print('Temp is %s' % z)
    elif y == 'BATT':
        print('Battery is %sv' % z)

這產生了以下輸出,正是我想要的:

[('A', 'TMPA', '18.5'), ('B', 'BATT', '2.97'), ('B', 'TMPA', '24.18')]
Temp is 18.5
Battery is 2.97v

我很高興,它甚至看起來很漂亮:)

非常感謝,

保羅

暫無
暫無

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

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