带变量文本的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>。我认为你的答案很有趣,但实际上不是推荐的方法。因为它会在全局范围内改变行为,并且可能会对较大的脚本产生非常意外的副作用。我当然不会称之为蟒蛇。