2

次の文字列が与えられます。

....00.3276021,,,constString1=31;garbage=00:00:00.0090000;constString2=16;garbage2=00.00...

の値を抽出して、変数に割り当てるにはどうすればよいですconstString1constString2。例えば:

string1_cummulativeTotal += [the magic returning the int]
string2_cummulativeTotal += [the magic returning the int]

ありがとう!

4

4 に答える 4

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'

これらはまだ文字列です。整数に変換することを忘れないでください。

于 2012-12-06T14:57:07.930 に答える
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
于 2012-12-06T15:07:40.527 に答える
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])
于 2012-12-06T15:16:55.810 に答える
-1

すべてを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 ....)である場合にのみ機能します。

于 2012-12-06T15:07:13.767 に答える