【问题标题】:Metacharacters python extracting dates元字符python提取日期
【发布时间】:2020-11-09 23:48:13
【问题描述】:

我想以月日年格式提取日期。

例如:2005 年 1 月 14 日或 1982 年 2 月 29 日

我使用的代码: 日期 = re.findall(r'\d{1,3} 一月|二月|三月|四月|五月|六月|七月|八月|九月|十月|十一月|十二月|一月|二月|三月|四月|五月|六月|七月|八月|九月|十月|十一月|十二月 \d{1,3}[, ]\d{4}',line)

python 将此解释为 1-2 位数字和 Jan 或每个月份。所以它只会匹配“Feb”或“12 Jan”,而不匹配其余部分

那么,我如何以可以使用 | 的方式仅对月份进行分组?仅适用于几个月,但不适用于表达式的其余部分

【问题讨论】:

  • 你说你想提取月日年格式的日期,但是给出了两种不同的格式。您的意思是“提取以下格式的日期,然后转换为月份日期年份”吗?
  • 是的。我只想提取日期本身以便稍后将其转换为月份日期年份:所以 2013 年 1 月 14 日 -> 2013 年 1 月 14 日

标签: python metacharacters


【解决方案1】:

直接回答您的问题,您可以为您的“日月年”和“月日年”格式制作两个正则表达式,然后分别检查它们。

import datetime

# Make months using list comp
months_shrt = [datetime.date(1,m,1).strftime('%b') for m in range(1,13)]
months_long = [datetime.date(1,m,1).strftime('%B') for m in range(1,13)]

# Join together
months = months_shrt + months_long
months_or = f'({"|".join(months)})'

expr_dmy = '\d{1,3},? ' + months_or + ',? \d{4}'
expr_mdy = months_or + ',? \d{1,3},? \d{4}'

您可以尝试两者,看看哪一个匹配。但是,您仍然需要检查它并将其转换为您最喜欢的日期格式。

相反,我建议不要使用正则表达式,只需尝试不同的date formats

str_a = ' ,'
str_b = ' ,'

base_fmts = [('%d', '%b', '%Y'),
             ('%d', '%B', '%Y'),
             ('%b', '%d', '%Y'),
             ('%B', '%d', '%Y')]

def my_formatter(s):
    for o in base_fmts:
        for i in range(2):
            for j in range(2):
                # Concatenate
                fmt = f'{o[0]}{str_a[i]} '
                fmt += f'{o[1]}{str_b[j]} '
                fmt += f'{o[2]}'
    
                try:
                    d = datetime.datetime.strptime(s, fmt)
                except ValueError:
                    continue
                else:
                    return d

上面的函数将接受一个字符串并返回一个datetime.datetime 对象。您可以使用标准的datetime.datetime 方法来获取您的日期、月份和年份。

>>> d = my_formatter('Jan 15, 2009')
>>> (d.month, d.day, d.year)
(1, 15, 2009)

【讨论】:

    猜你喜欢
    • 2016-09-08
    • 1970-01-01
    • 2011-02-17
    • 2020-08-20
    • 2020-03-25
    • 2020-08-14
    • 1970-01-01
    相关资源
    最近更新 更多