Python正则表达式在lis中查找日期

2024-09-30 04:41:48 发布

您现在位置:Python中文网/ 问答频道 /正文

当我在csv中循环时,我试图规范MySQL加载的日期(yyyy-mm-dd)。我试图搜索包含两个正斜杠的项目,但我发现它不够唯一,无法识别日期。这可以通过正则表达式和查找与模式匹配的项来实现吗?任何意见都将不胜感激。你知道吗

输入示例:

['1','2','01/02/2015','3','4','1-05-2015','5','Anot/her Ex/ample','6']

输出示例:

['1','2','2015-01-02','3','4','2015-01-05','5','Anot/her Ex/ample','6']

Tags: csv项目规范示例mysqlddex意见
3条回答
re.sub(r"(\d+)/(\d+)/(\d+)",r"\3-\1-\2",test_Str)

这应该能帮你。你知道吗

x= ['1','2','01/02/2015','3','4','1-05-2015','5','Anot/her Ex/ample','6']
print [re.sub(r"(\d+)/(\d+)/(\d+)",r"\3-\1-\2",i) for i in x ]

我觉得@PadraicCunningham的解决方案似乎是最有弹性的,它可以很容易地扩展如下,以满足另一种情况:

from datetime import datetime

l =  ['1','2','01/02/2015','3','4','1-05-2015','5','Another Ex/ample','6']

out = []

for ele in l:

    try:
        out.append(datetime.strptime(ele,"%m/%d/%Y").strftime("%Y-%m-%d")) 
        continue
    except ValueError:
        pass

    try:
        out.append(datetime.strptime(ele,"%m-%d-%Y").strftime("%Y-%m-%d")) 
    except ValueError:
        out.append(ele)

print(out)

现在将打印:

['1', '2', '2015-01-02', '3', '4', '2015-01-05', '5', 'Another Ex/ample', '6']

您还应该考虑以下测试用例。这些都不会导致任何改变。你知道吗

l = ['40/05/2015', '13/01/2000', '04/31/2001']

如果你知道这些领域的顺序。你可以用日期时间.strtime地址:

from datetime import datetime

l =  ['1','2','01/02/2015','3','4','1-05-2015','5','Another Ex/ample','6']

out = []

for ele in l:
    try:
        out.append(datetime.strptime(ele,"%d/%m/%Y").strftime("%Y-%m-%d"))    
    except ValueError:
        out.append(ele)

print(out)

我不知道您如何期望'1-05-2015'变成'2015-01-05',因为您只考虑日期的正斜杠:

如果要测试多个模式:

out = []

for ele in l:
    for patt in ["%d/%m/%Y","%d-%m-%Y"]:
        try:
            p1 = datetime.strptime(ele,patt).strftime("%Y-%m-%d")
            if p1:
                out.append(p1)
                break
        except ValueError as e:
            print(e)
    else:
        out.append(ele)

print(out)
['1', '2', '2015-01-02', '3', '4', '2015-01-05', '5', 'Anot/her Ex/ample', '6']

您还可以根据长度进行筛选,并仅尝试分析正确长度的字符串:

for ele in l:
    ln = len(ele)
    if 7 <= ln > 10:
        out.append(ele)
        continue
    for patt in ["%d/%m/%Y", "%d-%m-%Y"]:
        try:
            p1 = datetime.strptime(ele,patt).strftime("%Y-%m-%d")
            if p1:
                out.append(p1)
                break
        except ValueError as e:
            print(e)
    else:
        out.append(ele)

正则表达式可能会匹配的不仅仅是日期,所以除非您100%确定,否则至少应该在添加之前将正则表达式返回的内容强制转换为datetime对象。你知道吗

相关问题 更多 >

    热门问题