0

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

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

我使用的代码: date = re.findall(r'\d{1,3} Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec|January|February|March|四月|五月|六月|七月|八月|九月|十月|十一月|十二月 \d{1,3}[, ]\d{4}',line)

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

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

4

1 回答 1

0

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

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}'

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

相反,我建议根本不要使用正则表达式,而只是尝试不同的日期格式

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)
于 2020-07-20T21:06:28.577 回答