Python: как извлечь дату с помощью регулярных выражений - PullRequest
0 голосов
/ 26 декабря 2018

Я хотел бы извлечь даты только в определенном формате «Месяц, день, год». Если это в любом другом формате, я его пропущу.Я использовал приведенную ниже функцию регулярного выражения, но отображается только месяц, а не день и год.Кто-нибудь может указать, что не так

>>> date_pattern="(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May?|June?
|July?|Aug(?:ust)?|Sep(?:t(?:ember)?)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?\
s+\d{2},\s+\d{4})"

s = "the date is November 15, 2009"
print(re.findall(date_pattern,s))

Ожидаемый вывод: 15 ноября 2009 г.

Вывод вышеуказанного кода: "Ноябрь"

Ответы [ 3 ]

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

Или используйте re.search с group(0):

>>> date_pattern='(Jan(uary)?|Feb(ruary)?|Mar(ch)?|Apr(il)?|May|Jun(e)?|Jul(y)?|Aug(ust)?|Sep(tember)?|Oct(ober)?|Nov(ember)?|Dec(ember)?)\s+\d{1,2},\s+\d{4}'
>>> s = "the date is November 15, 2009"
>>> re.search(date_pattern,s).group(0)
'November 15, 2009'
>>> 

Посетите regex101 , который я создал для него.

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

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

(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June|July|Aug(?:ust)?|Sep(?:t(?:ember)?)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\s+\d{2},\s+\d{4}

Редактировать: На самом деле, это неправильное расположение ваших скобок.Вместо того, чтобы находиться в конце шаблона, он должен следовать за декабрьской альтернативой, потому что это ваша группа без захвата для названий месяцев.

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

Вы можете изменить регулярное выражение на:

(?:(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May?|June?|July?|Aug(?:ust)?|Sep(?:t(?:ember)?)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\s+\d{2},\s+\d{4})

Пояснения:

Ваше текущее регулярное выражение принимает образец, описанный здесь:

Демо: https://regex101.com/r/0teiAB/3

Если вы не добавите скобки, регулярное выражение примет либо один из определенных месяцев, либо Dec(?:ember)?)\s+\d{2},\s+\d{4}) - декабрь / декабрь, за которым следуют день и год

Демо: https://regex101.com/r/0teiAB/1

Дополнительные примечания:

  • для дней, \d{2} также будет принимать 33,99,00это не правильные календарные дни !!!-> Вы можете заменить эту часть на (?:0?[1-9]|[1-2][0-9]|30|31), чтобы ограничить диапазон, как показано в:

Демо: https://regex101.com/r/NTIyf7/1

  • Этого недостаточно, если вы хотите ограничить максимальный день в месяце (например, нет 31 февраля), если вы хотите перейти на этот уровень точности, вам нужно будет изменить регулярное выражение и использовать выражение, аналогичноеЯ ввел здесь ограничение для каждого месяца.

  • Последнее, но не менее важное, если вы идете еще дальше и хотите определить високосный год с 29 февраля .Regex, возможно, не является подходящим инструментом для этого, и вам придется использовать дату / календарь, чтобы проверить, является ли ваша дата действительной или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...