регулярное выражение даты в некотором тексте - PullRequest
2 голосов
/ 05 мая 2010

Как я могу найти как можно больше шаблонов дат в текстовом файле с помощью python? Шаблон даты определяется как:

dd mmm yyyy
  ^   ^
  |   |
  +---+--- spaces

где:

  • дд - двузначное число
  • ммм - английское название месяца из трех символов (например, январь, мар, декабрь)
  • гггг четырехзначный год
  • есть два пробела в качестве разделителей

Спасибо!

Ответы [ 5 ]

10 голосов
/ 05 мая 2010

Вот способ найти все даты, соответствующие вашему шаблону

re.findall(r'\d\d\s(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s\d{4}', text)

Но после того, как WilhelmTell прокомментировал ваш вопрос, мне также интересно, действительно ли это то, о чем вы действительно просили ...

5 голосов
/ 05 мая 2010

Используйте модуль календаря, чтобы дать вам немного глобального понимания:

date_expr = r"\d{2} (?:%s) \d{4}" % '|'.join(calendar.month_abbr[1:])
print date_expr
print re.findall(date_expr, source_text)

Для меня это создает date_expr как:

"\d{2} (:?Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d{4}"

Но если я изменю свою локаль, используя модуль локали:

locale.setlocale(0, "fr")

Я сейчас ищу месяцы по-французски:

"\d{2} (?:janv.|févr.|mars|avr.|mai|juin|juil.|août|sept.|oct.|nov.|déc.) \d{4}"

Хм, это первый раз, когда я пробовал сокращения французского месяца, возможно, мне нужно сделать некоторую очистку:

date_expr = r"\d{2} (?:%s) \d{4}" % '|'.join(
    m.title().rstrip('.') for m in calendar.month_abbr[1:])

Теперь я получаю:

"\d{2} (?:Janv|Févr|Mars|Avr|Mai|Juin|Juil|Août|Sept|Oct|Nov|Déc) \d{4}"

И теперь мой сценарий будет работать и для моих галльских друзей, с очень небольшими проблемами.

(Вы можете задаться вопросом, почему мне пришлось нарезать список month_abbr из [1:] - этот список начинается с пустой строки в позиции 0, так что если вы используете find () для поиска аббревиатуры конкретного месяца, вы будете верните число от 1 до 12, а не от 0 до 11.)

- Пол

4 голосов
/ 05 мая 2010

Вот немного более полный пример.Регулярное выражение будет соответствовать не только действительному значению даты.datetime.strptime не сможет выполнить синтаксический анализ чего-либо недопустимого и поднять ValueError.Если дата анализируется, то у вас есть полный datetime объект, который дает вам доступ ко многим функциям.

>>> from datetime import datetime
>>> import re
>>> dates = []
>>> patn = re.compile(r'\d{2} \w{3} \d{4}')
>>> fh = open('inputfile')
>>> for line in fh:
...   for match in patn.findall(line):
...     try:
...       val = datetime.strptime(match, '%d %b %Y')
...       dates.append(val)
...     except ValueError:
...       pass # ignore, this isn't a date
...

Я полагаю, что если вытак склонен.

0 голосов
/ 30 ноября 2010

или вы можете использовать это для полностью

date = re.findall(r'\d\d\s(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s\d{4}\s\d{2}:\d{2}', text)
print date
['30 November 2010 14:20', '30 November 2010 14:24']
0 голосов
/ 05 мая 2010

Попробуйте это:

import re

allmatches = re.findall(r'\d\d \w\w\w \d\d\d\d', "string to match")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...