【问题标题】:How to write a Regex to validate date format of type DAY, MONTH dd, yyyy?如何编写正则表达式来验证 DAY、MONTH dd、yyyy 类型的日期格式?
【发布时间】:2018-12-14 16:48:56
【问题描述】:

我有一个日期字符串,例如Thursday, December 13, 2018,即DAY, MONTH dd, yyyy,我需要使用正则表达式对其进行验证。

正则表达式不应验证错误的日期或月份。例如,Muesday, December 13, 2018Thursday, December 32, 2018 应标记为无效。

到目前为止,我能做的是为“、”、“dd”和“yyyy”编写表达式。我不明白我将如何自定义正则表达式,使其只接受正确的日期和月份的名称。

我的尝试:

^([something would come over here for day name]day)([\,]|[\, ])(something would come over here for month name)(0?[1-9]|[12][0-9]|3[01])([\,]|[\, ])([12][0-9]\d\d)$

谢谢。

编辑:我只包括了从 1000 年到 2999 年的年份。验证闰年并不重要。

【问题讨论】:

  • 我会尝试将其转换为datetime,如果成功,您就赢了。正则表达式更难阅读、理解、扩展、调试。类似于:stackoverflow.com/questions/466345/…跨度>
  • 您应该明确地将字符串解析为日期并检查它是否有效。有很多图书馆就是为此而生的(例如dateFnsmoment.js 等)。否则,您将如何使用正则表达式验证复杂的用例,例如 31. June 或错误的工作日名称?

标签: python regex


【解决方案1】:

您可以尝试为像您这样的“复杂”案例实现正则表达式的库。这称为日期查找器。

这个家伙让你在文本中找到任何类型的日期:

https://github.com/akoumjian/datefinder

安装:pip install datefinder

import datefinder

string_with_dates = "entries are due by January 4th, 2017 at 8:00pm
    created 01/15/2005 by ACME Inc. and associates."

matches = datefinder.find_dates(string_with_dates)

for match in matches:
    print(match)

# Output
2017-01-04 20:00:00
2005-01-15 00:00:00

要检测像“星期一”这样的错误单词,你可以使用 PyEnchant 这样的拼写检查器过滤你的文本

import enchant
>>> d = enchant.Dict("en_US")
>>> print(d.check("Monday"))
True
>>> print(d.check("Muesday"))
False
>>> print(d.suggest("Muesday"))
['Tuesday', 'Domesday', 'Muesli', 'Wednesday', 'Mesdames']

【讨论】:

    【解决方案2】:

    regex 不是解决您问题的方法!

    但这里有一些示例代码,您可以在其中看到如何编写模式中的something would come over here for day name-section。我还添加了如何使用 strptime() 的示例,这在您的情况下是一个更好的解决方案:

    import re
    from datetime import datetime
    
    s = """
    Thursday, December 13, 2018
    Muesday, December 13, 2018
    Monday, January 13, 2018
    Thursday, December 32, 2018
    """
    
    pat = r"""
    ^
    (Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday)\ 
    ([\,]|[\, ])\ 
    (January|February|March|April|May|June|July|August|September|October|November|December)\ 
    (0?[1-9]|[12][0-9]|3[01])
    ([\,]|[\, ])\ 
    ([12][0-9]\d\d)
    $
    """
    
    for match in re.finditer(pat, s, re.VERBOSE+re.MULTILINE):
        print match
    
    for row in s.split('\n'):
        try:
            match = datetime.strptime(row, '%A, %B %d, %Y')
            print match
        except:
            print "'%s' is not valid"%row
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-09
      • 2012-01-03
      • 2023-04-07
      • 2020-02-03
      • 2011-04-21
      • 2013-07-04
      相关资源
      最近更新 更多