python正则表达式在字符串中查找/匹配一个或多个

时间:2016-03-14 18:55:25

标签: python regex

我几乎看不到搜索谷歌和本网站的问题解决方案了。

我想从字符串中挑选出两个不同文本字符串的一个或多个序列:

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')]

有更好的方法吗?

我可以轻松访问元组列表中的值吗?

请注意,我花了好几个小时,不要轻易寻求帮助。

非常感谢,

4 个答案:

答案 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

根据您的输入,它将捕获

  • aSATMPA23.37
  • aSABATT2.05

答案 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

我很高兴,它甚至看起来很漂亮:)。

非常感谢,