我有一个看起来像这样的字符串:
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')]
如上所述,也可能有一个或多个数字,但前面总会有一个字符串。
答案 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']]