Как написать регулярное выражение для проверки формата даты типа DAY, MONTH dd, yyyy? - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть строка даты типа Thursday, December 13, 2018, т. Е. DAY, MONTH dd, yyyy, и мне нужно проверить ее с помощью регулярного выражения.

Регулярное выражение не должно проверять неправильный день или месяц.Например, Muesday, December 13, 2018 и Thursday, 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 год. Проверка високосных годов не имеет значения.

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

regex - не способ решить вашу проблему!

Но вот пример кода, в котором вы можете увидеть, как можно написать something would come over here for day name -раздел в вашем шаблоне.Я также добавил пример использования 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
0 голосов
/ 13 декабря 2018

Вы можете попробовать библиотеку, которая реализует регулярные выражения для "сложного" случая, подобного вашему.Это называется datefinder.

Этот парень поручил вам найти любую дату в текстах:

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

Чтобы обнаружить неправильные слова, такие как «Muesday», вы фильтруете свой текст с помощью проверки орфографии, такой как 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']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...