给出以下字符串;
....00.3276021,,,constString1=31;garbage=00:00:00.0090000;constString2=16;garbage2=00.00...
如何提取constString1
和constString2
的值,以便我可以将它们分配给变量。例如:
string1_cummulativeTotal += [the magic returning the int]
string2_cummulativeTotal += [the magic returning the int]
谢谢!
答案 0 :(得分:8)
In [1]: import re
In [2]: s = '....00.3276021,,,constString1=31;garbage=00:00:00.0090000;constString2=16;garbage2=00.00...'
In [3]: re.search('constString1=(\d+);', s).group(1)
Out[3]: '31'
In [4]: re.search('constString2=(\d+);', s).group(1)
Out[4]: '16'
这些仍然是字符串,不要忘记将它们转换为整数。
答案 1 :(得分:6)
你可以在没有正则表达式的情况下完成。
def get_sub(s, start, end):
s1 = s[s.find(start) + len(start):]
return s1[:s1.find(end)]
get_sub(s, "constString1=", ";")
>>> '31'
get_sub(s, "constString2=", ";")
>>> '16'
如果您想将其转换为其他类型,您可以执行以下操作:
def get_sub(s, start, end, cast_to):
s1 = s[s.find(start) + len(start):]
return cast_to(s1[:s1.find(end)])
get_sub(s,"constString1=",";", int)
>>> 31
get_sub(s,"constString2=",";", float)
>>> 16.0
修改强>
这种方法实际上比正则表达式更快:
t1 = timeit.Timer(stmt="""get_sub(s,"constString1=",";", int)""", setup="""s = "....00.3276021,,,constString1=31;garbage=00:00:00.0090000;constString2=16;garbage2=00.00..."
def get_sub(s, start, end, cast_to):
s1 = s[s.find(start) + len(start):]
return cast_to(s1[:s1.find(end)])""")
t2 = timeit.Timer(stmt="""int(re.search("constString1=(\d+);",s).group(1))""", setup="""import re
s = "....00.3276021,,,constString1=31;garbage=00:00:00.0090000;constString2=16;garbage2=00.00..."
""")
>>> t1.timeit()
2.829952681655172
>>> t2.timeit()
3.7208872074169506
答案 2 :(得分:2)
除了其他答案中提到的正则表达式方法之外,如果使用分号分隔单独的项目,则可以使用split(';')
和split('=')
之类的代码,如下所示:
s='....00.3276021,,,;constString1=31;garbage=00:00:00.0090000;constString2=16;garbage2=00.00...'
string1_subtotal = string2_subtotal = 0
for ss in s.split(';'):
a = ss.split('=')
if a[0]=='constString1': string1_subtotal += int(a[1])
if a[0]=='constString2': string2_subtotal += int(a[1])
答案 3 :(得分:-1)
为什么不一次性完成这一切?
>>> import re
>>> s = "....00.3276021,,,constString1=31;garbage=00:00:00.0090000;constString2=16;garbage2=00.00..."
>>> ms = re.match(r'.*constString1=(\d+);.*constString2=(\d+);', s)
>>> ms.groups() #just to show you. you wont need to do this on your code...
('31', '16')
>>> string1_cummulativeTotal += ms.group(1)
>>> string2_cummulativeTotal += ms.group(2)
注意:这仅在contString
的顺序正确时才有效(1,2 ....)