[英]Python regex if match for more than one criteria in the same regex string
[英]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
觀看演示
根據您的輸入,它將捕獲
感謝所有做出了貢獻的人,在您的幫助下,我提出了以下建議:
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.