2014-01-06 2 views
0

당신이 추측 할 수파이썬 정규식 : 초

['23m3s', '23:34', '53min 3sec', '2h 3m', '22.10', '1:23:33', ...] 

을 다음과 같이 내가 목록에 지속 시간의 무리가 혼합 된 형식 문자열 기간은, 사용되는 서식의 시간 N 순열이 있습니다.

파이썬에서 각 요소의 지속 시간을 초 단위로 추출하는 가장 효율적이거나 간단한 방법은 무엇입니까?

+0

: -O 그러나 그들은 모두 무작위입니까? 내 말은, 예를 들어, 23:34 무엇입니까? 23 시간 34 분? 아니면 1시 23 분 33 초? 1 일 23 시간 33 분, 1 시간 23 분 33 초 같습니까? – maurelio79

+0

당신은 각각에 대해'strptime' 포맷을 작성하고 그것을 루프로 파싱해야합니다. – roippi

+0

@ maurelio79 23:34는 23m 34s이고 1.23.33은 1h 23m 33s입니다. 이것이 항상 그렇다고 가정 해 봅시다. –

답변

2

이것은 아마도 약간 미숙하지만 지금까지 게시 한 모든 데이터에 대한 트릭을 수행하는 것으로 보입니다. 두 번째 합계는 모두 내가 기대하는 것입니다. retimedelta의 조합은이 작은 샘플의 트릭을 수행하는 것으로 보입니다. 정규 표현식에의 사전

>>> import re 
>>> from datetime import timedelta 

첫째 :

>>> def convert_to_seconds(*time_str): 
    timedeltas = [] 
    for t in time_str: 
     td = timedelta(0) 
     for key in d: 
      for regex in d[key]: 
       if regex.search(t): 
        if key == 'hours': 
         td += timedelta(hours=int(regex.search(t).group(1))) 
        elif key == 'minutes': 
         td += timedelta(seconds=int(regex.search(t).group(1)) * 60) 
        elif key == 'seconds': 
         td += timedelta(seconds=int(regex.search(t).group(1))) 
     print(td.seconds) 

: 는 귀하의 의견 그리고

d = {'hours': [re.compile(r'(\d+)(?=h)'), re.compile(r'^(\d+)[:.]\d+[:.]\d+')], 
    'minutes': [re.compile(r'(\d+)(?=m)'), re.compile(r'^(\d+)[:.]\d+$'), 
    re.compile(r'^\d+[.:](\d+)[.:]\d+')], 'seconds': [re.compile(r'(\d+)(?=s)'), 
    re.compile(r'^\d+[.:]\d+[.:](\d+)'), re.compile(r'^\d+[:.](\d+)$')]} 

정규 표현식에 밖으로 시도하는 기능 (아마도 여전히 비트 원유)에 근거한 업데이트 결과는 다음과 같습니다.

>>> convert_to_seconds(*t) 
1383 
1414 
3183 
7380 
1330 
5013 

더 많은 데이터가 발생할 때마다 정규 표현식을 더 추가 할 수 있지만 어느 정도까지만 가능합니다.

+0

좋은 물건입니다. 그리고 나는이 길을 탐색했지만,'정규 표현식 사전 '에 계속 추가해야했습니다. 고맙습니다. –

+1

23 : 34는 23 분 34 초가 아니라 23 시간 34 분입니다. 감사합니다. '22.10 '과 동일합니다. – Toto

+0

@ m42 그 점을 지적 해 주셔서 감사합니다. 나는이 효과에 대한 OP의 코멘트를 놓쳤다. 정규 표현식을 업데이트하고 새로운 결과를 게시했습니다. –