Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.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 strTime_Python_String Formatting - Fatal编程技术网

带变量文本的Python strTime

带变量文本的Python strTime,python,string-formatting,Python,String Formatting,我有一个字符串形式的日期列表。看起来是这样的: [ "January 29-30 Meeting - 2013", "March 19-20 Meeting - 2013", "April/May 30-1 Meeting - 2013", "June 18-19 Meeting - 2013", "July 30-31 Meeting - 2013", "September 17-18 Meeting - 2013", "October 29-30 Meeting

我有一个字符串形式的日期列表。看起来是这样的:

[
  "January 29-30 Meeting - 2013",
  "March 19-20 Meeting - 2013",
  "April/May 30-1 Meeting - 2013",
  "June 18-19 Meeting - 2013",
  "July 30-31 Meeting - 2013",
  "September 17-18 Meeting - 2013",
  "October 29-30 Meeting - 2013",
  "December 17-18 Meeting - 2013"
]
我需要将这些日期解析为
datetime
格式

datetime.strptime("January 29-30 Meeting - 2013", "%B %d-[something] - %Y")
datetime.strptime("January 29-30 Meeting - 2013", "%B [something]-%d [something] - %Y")

在格式说明符中,有没有办法告诉strtime忽略
[something]
中的文本,因为它可以是可变的?变量文本是否有格式说明符?

strtime没有通配符指令。您可以在这里看到指令列表

解决问题的一个明智的方法是将正则表达式和strtime结合起来。也就是说,用正则表达式过滤掉文本,然后将剩余的受限文本放入
strtime
,或者直接将匹配的组传递到
datetime

import re
from datetime import datetime

ss = [
  "January 29-30 Meeting - 2013",
  "March 19-20 Meeting - 2013",
  "April/May 30-1 Meeting - 2013",
  "June 18-19 Meeting - 2013",
  "July 30-31 Meeting - 2013",
  "September 17-18 Meeting - 2013",
  "October 29-30 Meeting - 2013",
  "December 17-18 Meeting - 2013"
]

FORMAT = '%B %d %Y'

for s in ss:
    match = re.search(r"(\w+)\s(\d+)-(\d+)\s.*\s(\d{4})", s)
    if match:
        dt1 = datetime.strptime(f'{match.group(1)} {match.group(2)} {match.group(4)}', FORMAT)
        dt2 = datetime.strptime(f'{match.group(1)} {match.group(3)} {match.group(4)}', FORMAT)

        print (dt1, dt2)
请注意,您还有4月/5月30-1日的并发症,我不是在讨论这个问题,因为您不是在问这个问题

不过,作为奖励:

for s in ss:
    match = re.search(r"((\w+)/)?(\w+)\s(\d+)-(\d+)\s.*\s(\d{4})", s)
    if match:
        dt1 = datetime.strptime(
            f'{match.group(2) if match.group(2) else match.group(3)} {match.group(4)} {match.group(6)}', FORMAT)
        dt2 = datetime.strptime(
            f'{match.group(3)} {match.group(5)} {match.group(6)}', FORMAT)

        print (dt1, dt2)

另外,请注意下面@blhsing提供的一个有趣的、但有点不成熟的解决方案,涉及
\u strtime.TimeRE
。我不建议您这样做,但有趣的是,您实际上可以通过这种方式更改
strtime
本身的行为。

您可以使用一个附加指令覆盖
\u strtime.TimeRE
对象,该指令惰性地匹配任何字符序列:

from datetime import datetime
import _strptime
TimeRE = _strptime.TimeRE()
TimeRE.update({'x': '.*?'})
_strptime._TimeRE_cache = TimeRE
print(datetime.strptime("January 29-30 Meeting - 2013", "%B %d-%x - %Y"))
这将产生:

2013-01-29 00:00:00

我假设它是正则表达式,不属于我的领域,但是
“4月/5月30-1日”
?你说得对。我想我会手动管理这些异常。。。多痛苦啊。谢谢指点。注意这是使用<代码>搜索>代码>而不是<代码>匹配>代码>使第一个示例工作-第二个示例实际上从一开始就匹配整个字符串,因此你可以考虑使用<代码>匹配< /COD>。我认为你的答案很有趣,但实际上不是推荐的方法。因为它会在全局范围内改变行为,并且可能会对较大的脚本产生非常意外的副作用。我当然不会称之为蟒蛇。