我几乎看不到搜索谷歌和本网站的问题解决方案了。
我想从字符串中挑选出两个不同文本字符串的一个或多个序列:
e.g。 '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')]
有更好的方法吗?
我可以轻松访问元组列表中的值吗?
请注意,我花了好几个小时,不要轻易寻求帮助。
非常感谢,
保
答案 0 :(得分:3)
>>> 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'
答案 1 :(得分:2)
有更好的方法吗?
是。摆脱所有括号:
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])
。
答案 2 :(得分:1)
尝试以下正则表达式:
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
请参阅demo
根据您的输入,它将捕获
答案 3 :(得分:0)
感谢所有回复和贡献的人,在您的帮助下,我提出了以下建议:
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
我很高兴,它甚至看起来很漂亮:)。
非常感谢,
保