Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Python计算用户输入时间_Python_Regex - Fatal编程技术网

用Python计算用户输入时间

用Python计算用户输入时间,python,regex,Python,Regex,我需要计算(使用python)用户输入的时间,不管他们输入的是3:30还是3.5。我真的不确定最好的方法是什么,我想我应该征求专家的意见 ==编辑================== 为了更清楚地指定,我希望用户输入小时和分钟,或者只输入分钟。我希望他们能够以两种格式输入时间,可以是hh:mm(3:30或03:30),也可以是float(3.5)小时 总体目标是跟踪他们工作的时间。所以,我将把他们输入的时间加起来,得到一个总数。有一些可能的解决方案,但在某个时候,你会遇到不明确的情况,这将导致任

我需要计算(使用python)用户输入的时间,不管他们输入的是3:30还是3.5。我真的不确定最好的方法是什么,我想我应该征求专家的意见

==编辑==================

为了更清楚地指定,我希望用户输入小时和分钟,或者只输入分钟。我希望他们能够以两种格式输入时间,可以是hh:mm(3:30或03:30),也可以是float(3.5)小时


总体目标是跟踪他们工作的时间。所以,我将把他们输入的时间加起来,得到一个总数。

有一些可能的解决方案,但在某个时候,你会遇到不明确的情况,这将导致任意转换

总的来说,我建议接受任何输入并解析分隔符(无论:或.或其他),然后根据您定义的某些单位模式转换为秒

或者,您可以执行一系列try/except语句,根据不同的时间格式方案对其进行测试,以查看是否匹配


我不确定在您的情况下什么是最好的…

您能精确定义允许用户输入的字符串的语法吗?一旦您这样做了,如果它足够简单,就可以用简单的Python字符串表达式来匹配它,否则您最好使用pyparsing之类的方法。此外,精确的语法将使识别任何歧义变得更容易,因此您可以更改规则(这样就不会有任何输入字符串是歧义的),或者至少可以决定如何准确地解释它们(并记录事实,以利于用户!)

编辑:鉴于OP的澄清(hh:mm或仅几分钟作为浮动),它似乎很简单:

  while True:
    s = raw_input('Please enter amount of time (hh:mm or just minutes):')
    try:
      if ':' in s:
        h, m = s.split(':')
      else:
        h = ''
        m = s
      t = int(h)*3600 + float(m)* 60
    except ValueError, e:
      print "Problems with your input (%r): %s" % (s, e)
      print "please try again!"
    else:
      break

在准确诊断用户输入可能存在的问题时,您可能希望变得更细粒度(当您接受和解析用户输入时,99%的精力用于识别难以置信的[[咒骂删除]]错误:很难让代码变得万无一失,因为愚人是非常天真的!),但这应该可以帮助您开始。

首先,您需要一些约定。是3.55分到4小时,5毫秒到4秒,还是3分到55/100分/小时/秒?这同样适用于3:55。至少在点和冒号之间有区别,指定点表示分数,冒号表示小时/分钟/秒的分隔符

虽然您还没有指定“时间”是什么(从什么时候开始或从什么时候开始?),但您也需要它

然后,很简单的一件事就是拥有一个你想要处理的时间的最终表示,并不断转换输入,直到你的最终表示实现。假设您决定最终时间应表示为MM:SS(两位数代表分钟,一个冒号,两位数代表秒),您需要搜索字符串中允许出现的字符,并相应地执行操作。例如,不允许同时使用冒号和点。如果有一个单独的冒号,你有一个分数,因此你将把第二部分视为60的分数

继续这样做,直到你有了你的最终陈述,然后用你说的“时间”做你该做的


我不知道您使用的是什么约束条件,但如果您没有单一的“时间”输入,而是有两个约束条件,则问题可能会缩小:第一个是人们键入小时,第二个是他们键入分钟。当然,这只有在您可以分割输入的情况下才有效…

这是我们内部web应用程序中的代码,用于时间跟踪。当用户输入时间时,字符串值通过该函数传递,该函数返回时间数据的结构

它是用javascript编写的,代码可以直接移植到python

我希望这能有点帮助

var ParseTime_NOW_MATCH = /^ *= *$/
var ParseTime_PLUS_MATCH = /^ *\+ *([0-9]{0,2}(\.[0-9]{0,3})?) *$/
var ParseTime_12_MATCH = /^ *([0-9]{1,2}):?([0-9]{2}) *([aApP])[mM]? *$/
var ParseTime_24_MATCH = /^ *([0-9]{1,2}):?([0-9]{2}) *$/


// ########################################################################################
// Returns either:
//  {
//      Error: false,
//      HourDecimal: NN.NN,
//      HourInt: NN,
//      MinuteInt: NN,
//      Format12: "SS:SS SS",
//      Format24: "SS:SS"
//  }
// or
//  {
//      Error: true,
//      Message: "Error Message"
//  }
function ParseTime(sTime)
{
    var match;

    var HH12;
    var HH24;
    var MM60;
    var AMPM;

    ///////////////////////////////////////////////////////////////////////////////////////
    if((match = ParseTime_NOW_MATCH.exec(sTime)) != null)
    {
//              console.log(match);
        return {Error: true, Message: "Unsupported format"};
    }
    ///////////////////////////////////////////////////////////////////////////////////////
    else if((match = ParseTime_PLUS_MATCH.exec(sTime)) != null)
    {
//              console.log(match);
        return {Error: true, Message: "Unsupported format"};
    }
    ///////////////////////////////////////////////////////////////////////////////////////
    else if((match = ParseTime_24_MATCH.exec(sTime)) != null)
    {
//              console.log("24");
//              console.log(match);
        HH24 = parseInt(match[1], 10);
        MM60 = parseInt(match[2], 10);

        if(HH24 > 23 || MM60 > 59)
        {
            return {Error: true, Message: "Invalid Hour or Minute (24)."};
        }
        else if(HH24 == 0)
        {
            HH12 = 12;
            AMPM = 'AM';
        }
        else if(HH24 <= 11)
        {
            HH12 = HH24;
            AMPM = 'AM';
        }
        else if(HH24 == 12)
        {
            HH12 = HH24;
            AMPM = 'PM';
        }
        else
        {
            HH12 = HH24 - 12;
            AMPM = 'PM';
        }

    }
    ///////////////////////////////////////////////////////////////////////////////////////
    else if((match = ParseTime_12_MATCH.exec(sTime)) != null)
    {
//              console.log(match);
        AMPM = ((match[3] == 'A' || match[3] == 'a') ? 'AM' : 'PM');
        HH12 = parseInt(match[1], 10);
        MM60 = parseInt(match[2], 10);

        if(HH12 > 12 || HH12 < 1 || MM60 > 59)
        {
            return {Error: true, Message: "Invalid Hour or Minute (12)."};
        }
        else if(HH12 == 12 && AMPM == 'AM')
        {
            HH24 = 0;
        }
        else if(AMPM == 'AM')
        {
            HH24 = HH12;
        }
        else if(AMPM == 'PM')
        {
            HH24 = HH12 + 12;
        }
    }
    ///////////////////////////////////////////////////////////////////////////////////////
    else
    {
        return {Error: true, Message: "Invalid Time Format."};
    }

    return {
        Error       : false,
        HourDecimal : HH24 + (MM60 / 60),
        HourInt     : HH24,
        MinuteInt   : MM60,
        Format12    : HH12 + ':' + (MM60 < 10 ? "0"+MM60 : MM60) + ' ' + AMPM,
        Format24    : (HH24 < 10 ? "0"+HH24 : HH24) + ':' + (MM60 < 10 ? "0"+MM60 : MM60)
    }

}
var ParseTime\u NOW\u MATCH=/^*=*$/
var ParseTime加上匹配=/^*\+*([0-9]{0,2}(\.[0-9]{0,3}))*$/
var ParseTime_12_MATCH=/^*([0-9]{1,2}):?([0-9]{2})*([aApP])[mM]*$/
var ParseTime_24_MATCH=/^*([0-9]{1,2}):?([0-9]{2})*$/
// ########################################################################################
//返回以下任一项:
//  {
//错误:false,
//小时:NN.NN,
//HourInt:NN,
//分钟:NN,
//格式12:“SS:SS”,
//格式24:“SS:SS”
//  }
//或
//  {
//错误:正确,
//消息:“错误消息”
//  }
函数解析时间(sTime)
{
var匹配;
HH12变种;
var-HH24;
var-MM60;
var-AMPM;
///////////////////////////////////////////////////////////////////////////////////////
if((match=ParseTime\u NOW\u match.exec(sTime))!=null)
{
//控制台日志(匹配);
返回{错误:true,消息:“不支持的格式”};
}
///////////////////////////////////////////////////////////////////////////////////////
else if((match=ParseTime加上\u match.exec(sTime))!=null)
{
//控制台日志(匹配);
返回{错误:true,消息:“不支持的格式”};
}
///////////////////////////////////////////////////////////////////////////////////////
else if((match=ParseTime\u 24\u match.exec(sTime))!=null)
{
//控制台日志(“24”);
//控制台日志(匹配);
HH24=parseInt(匹配[1],10);
MM60=parseInt(匹配[2],10);
如果(HH24>23 | | MM60>59)
{
返回{错误:true,消息:“无效的小时或分钟(24)。”;
}
否则如果(HH24==0)
{
HH12=12;
AMPM='AM';
}
否则如果(HH24 12 | | HH12<1 | | MM60>59)
{
返回{错误:true,消息:“无效的小时或分钟(12)。”;
}
else if(HH12==12&&M=='AM')
{
HH24=0;
}
else if(AMPM=='AM')
{
HH24=HH12;
}
else if(AMPM=='PM')