为什么这个python异常不是ValueError?

时间:2017-05-03 15:53:13

标签: python

代码:

import datetime

TF = "%d-%M-%Y %H:%M"
last= datetime.datetime.strptime( "11/07/10 10:00", TF)

引发以下异常:

Traceback (most recent call last):
  File "strange.py", line 4, in <module>
    last= datetime.datetime.strptime( "11/07/10 10:00", TF)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/_strptime.py", line 308, in _strptime
    format_regex = _TimeRE_cache.compile(format)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/_strptime.py", line 265, in compile
    return re_compile(self.pattern(format), IGNORECASE)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py", line 194, in compile
    return _compile(pattern, flags)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py", line 251, in _compile
    raise error, v # invalid expression
sre_constants.error: redefinition of group name 'M' as group 5; was group 2

现在我相信我的错误是我在定义日期格式时使用%M两次。这是我的疑问:

我希望代码可以:

a)接受你的事实在字符串中有两次相同的时间值(它可能是重要的,但是#34;星期一和#34;如果你有其余的日期) b)抛出一个值错误,表示同一个字段不应该被多次使用。

这看起来非常不同。发生了什么事?

3 个答案:

答案 0 :(得分:1)

当“内置操作或函数接收到具有正确类型但值不合适的值的参数”(docs)时使用

Value Error - 所以在这种情况下,这意味着发送{{1}作为格式错误的格式错误的字符串(例如,尝试TF)。

在这里你使用了正确的格式 - 但是当你的错误提到时,你在SRE配对部分失败了 - 因为你定义了同一个组(这是解释%K的方式)两次,以及正则表达式解析器失败,因为当你告诉他组%x应该匹配字符串的两个不同部分时它无法理解,它不能自己“猜测”。

答案 1 :(得分:0)

没有直接检测到您所犯的具体错误。

日期时间模块将您的strptime格式转换为正则表达式以进行实际解析,而无需对其进行分析(或有任何需要对其进行分析),以足够详细地注意重复字段。这导致了一个无效的正则表达式,并且re模块正确地抛出了一个错误 - 我认为它更接近于SyntaxError而不是ValueError。 datetime模块在没有试图找出问题根源的情况下传递了它。

答案 2 :(得分:0)

你有2个错误:

  1. 格式不匹配,因为您在TF中使用“ - ”并作为时间传递“/”!你应该传递与字符串相同的格式。

  2. 你通过2分钟符号('M'=分钟,'m'=月)

  3. 这是适合您的正确解决方案:

    import datetime
    
    TF = "%d-%m-%y %H:%M"
    last= datetime.datetime.strptime( "11-07-10 10:00", TF)
    
    祝你好运!