0

正規表現を使用して、時間値からこの種のデータを抽出したいと思います。

1h 34mn 2s     >>> [1,34,2]
1h 4mn         >>> [1,4]
34mn 2s        >>> [34,2]
34s            >>> [34]

私が試した:

re.match(r'((.*)h)?((.*)mn)?((.*)s)?', '1h 34mn').groups()
('1h', '1', ' 34mn', ' 34', None, None)

ほぼ完了しましたが、それでも私が探しているものではありません。

編集:

合計値を秒単位で抽出する必要があります1h 34mn 2s >>> 1*3600+34*60+2

4

4 に答える 4

5

秒だけが必要で、時が分に先行し、分が秒に先行することをあまり心配しない場合は、修飾されている限り (つまり、「1s 9h 32m」が有効)、次のように使用できます。

import re

mult = {'h': 60*60, 'mn': 60}
res = sum(int(num) * mult.get(val, 1) for num, val in re.findall('(\d+)(\w+)', '1h 34mn 2s'))
# 5642
于 2012-10-22T21:14:45.967 に答える
2

データがあなたの例のようになっている場合は、次のように簡単に実行できます。

In [171]: import re

In [172]: s='1h 34mn 2s'

In [173]: re.findall('\d+',s)
Out[173]: ['1', '34', '2']

またはあなたがしたい場合int

In [175]: [int(i)for i in re.findall('\d+',s)]
Out[175]: [1, 34, 2]
于 2012-10-22T20:58:31.783 に答える
1

これを試して:

[in] regex = re.compile(r'^(?:(\d+)h)?(?: *)(?:(\d+)mn)?(?: *)(?:(\d+)s)?$')
[in] for x in ("1h 34mn 2s", "1h 4mn", "34mn 2s", "34s"):
[in]     hours, minutes, seconds = regex.match(x).groups()
[in]     total = 0
[in]     if hours:
[in]         total += int(hours) * 3600
[in]     if minutes:
[in]         total += int(minutes) * 60
[in]     if seconds:
[in]         total += int(seconds)
[in]     print total

[out] 5642
[out] 3840
[out] 2042
[out] 34

すべての入力でトリプルを探しているわけではないことに気付きました。今修正しました。

于 2012-10-22T20:59:11.267 に答える
0

接吻

import re

a = ['1h 34mn 2s','1h 4mn','34mn 2s','34s']

def convert(s):
    if s:
        return int(s[0])
    else:
        return 0

def get_time(a):
    h = convert(re.findall('(\d*)h',a))
    m = convert(re.findall('(\d*)m',a))
    s = convert(re.findall('(\d*)s',a))
    return h,m,s

for i in a:
    print get_time(i)

出力:

(1, 34, 2)
(1, 4, 0)
(0, 34, 2)
(0, 0, 34)

編集。私はちょうどあなたが秒で日付が欲しいことを見ました。get_time関数の戻り行を次のように編集するだけです。

return h*3600+m*60+s

出力:

5642
3840
2042
34
于 2012-10-22T21:30:17.073 に答える