提取=和之间的整数;

Fab*_*ian 2 python regex file-io readline

给出以下字符串;

....00.3276021,,,constString1=31;garbage=00:00:00.0090000;constString2=16;garbage2=00.00...
Run Code Online (Sandbox Code Playgroud)

如何提取值constString1,constString2以便我可以将它们分配给变量.例如:

string1_cummulativeTotal += [the magic returning the int]
string2_cummulativeTotal += [the magic returning the int]
Run Code Online (Sandbox Code Playgroud)

谢谢!

Lev*_*sky 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'
Run Code Online (Sandbox Code Playgroud)

这些仍然是字符串,不要忘记将它们转换为整数.


zen*_*poy 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'
Run Code Online (Sandbox Code Playgroud)

如果你想将它转换为另一种类型,你可以做类似的事情:

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
Run Code Online (Sandbox Code Playgroud)

编辑

这个方法实际上比正则表达式更快:

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
Run Code Online (Sandbox Code Playgroud)