找到多个出现作为较大模式的一部分

时间:2017-04-03 11:00:49

标签: python regex

我有一个看起来像这样的字符串:

string = 0.033 0.0331
string2   =  0.0022e+002  123.4

在这种情况下,两个字符串的数字列表都是两个,但这可以是一个或多个。

我想匹配字符串和数字,以便我使用数字并将它们放在列表中。但是我似乎无法匹配所有个别数字。我使用以下正则表达式(示例字符串作为输入):

matchNum = re.findall(r'(\S+)\s*=\s*((\d+\.?\d*e?[+-]?\d*)\s*)+', 'string2   =  0.0022e+002  123.4')

然而,这仅返回字符串和最后一个数字(两次),如下所示:

[('String2', '123.4\n', '123.4')]

知道我怎么能得到这个(?):

[('String2', '0.0022e+002', '123.4')]

如上所述,也可能有一个或多个数字,但前面总会有一个字符串。

2 个答案:

答案 0 :(得分:1)

您可以先收集匹配项,然后将=之前的部分捕获到第1组 和=之后的部分进入第2组,并使用第二个正则表达式仅提取数字。以下是一个代码段,您可以进一步调整以满足任何特定要求:

import re
s = 'string2   =  0.0022e+002  123.4'
r1 = re.compile(r'(\S+)\s*=\s*((?:(?:-?\d+\.?\d*(?:e[+-]?\d+)?)\s*)+)', re.I)
r2 = re.compile(r'-?\d+\.?\d*(?:e?[+-]?\d+)?', re.I)
matches = r1.finditer(s)
res = []
for x in matches:
    tmp = [x.group(1)]
    tmp.extend(r2.findall(x.group(2)))
    res.append(tmp)
print(res)

请参阅Python demo

r1正则表达式会找到与您需要的所有数据匹配的内容,r2会在匹配后从第2组中提取必要的数字。

答案 1 :(得分:0)

Mabye这样的事情:

import re

s = """
string = 0.033 0.0331
string2   =  0.0022e+002  123.4
string3 = 0.8291 
"""

rgx = re.compile(r'([^ \n]*) *= *([^ ]+) *([^ \n]+)?')
for x in rgx.finditer(s):
    print x.groups()

# ('string', '0.033', '0.0331')
# ('string2', '0.0022e+002', '123.4')
# ('string3', '0.8291', None)

如果您不需要print tuple(x for x in x.groups() if x),则可以使用None

[编辑] 支持任意数量的数字的另一个方法:

s = """
string = 0.033 0.0331
string2   =  0.0022e+002  123.4
string3 = 0.8291 
string4= 0.1 0.2 0.3 0.4 0.5
"""

rgx = re.compile('[^ \n=]+')
print [rgx.findall(l) for l in s.splitlines() if l]

# [['string', '0.033', '0.0331'], ['string2', '0.0022e+002', '123.4'], 
#  ['string3', '0.8291'], ['string4', '0.1', '0.2', '0.3', '0.4', '0.5']]