Есть строки: "1m57s", "17s520ms", "1m", "10s", "200ms" и так далее. Надо распарсить с помощью pyparsing в минусы, секунды и миллисекунды.
minutes = ( Word(nums, max=8) + Suppress(Literal("m")) + Suppress(CharsNotIn("s") or Empty()) ) ('minutes')
seconds = ( Word(nums, max=8) + Suppress(Literal("s")) ) ('seconds')
mseconds = ( Word(nums, max=8) + Suppress(Literal("ms")) ) ('mseconds')
пытался сделать так, но либо не ловятся строки вида "1m", либо на строке 400ms ловится первая часть(400m) и ошибочно принимается за минуты.
Вот код для проверки:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
from pyparsing import *
strings = {"1m57s", "17s520ms", "1m", "10s", "200ms"}
def parse_second(string):
minutes = ( Word(nums, max=8) + Suppress(Literal("m")) + (Suppress(CharsNotIn("s") or Empty())) ) ('minutes')
seconds = ( Word(nums, max=8) + Suppress(Literal("s")) ) ('seconds')
time_minutes = minutes
time_seconds = seconds
string = string.rstrip()
minutes_count = 0
seconds_count = 0
try:
parsed_time_minutes = time_minutes.parseString(string)
if (parsed_time_minutes.minutes != ""):
minutes_count = int(parsed_time_minutes.minutes.asList()[0])
except BaseException:
pass
try:
parsed_time_seconds = time_seconds.parseString(string)
if (parsed_time_seconds.seconds != ""):
seconds_count = int(parsed_time_seconds.seconds.asList()[0])
except BaseException:
pass
all_sec = (minutes_count*60) + seconds_count
return all_sec
def parse():
for element in strings:
result = parse_second(element)
print(element, result)
parse()
Результат работы:
('1m57s', 60) ✗ Неправильно, должен быть 60+57=117
('10s', 10) ✓ Правильно
('1m', 0) ✗ Неправильно, должен быть 60
('17s520ms', 17) ✓ Правильно, целых секунд — 17
('200ms', 0) ✓ Правильно, целых секунд — ноль