LINUX.ORG.RU

python как вырезать дату из произвольной строки


0

1

всем привет. вот возник вопрос, как можно вырезать дату из произвольной строки? пытался использовать: re.sub(r"[^(\d{2}\/\d{2}\/\d{2,4})]","",some_string) но пропускает не нужные числа. искал в инете ничего толкового не нашел, да и скорость не позволяет много искать может у кого есть какие идеи?


но пропускает не нужные числа

Так тебе дату нужно вырезать или еще и числа?

baverman ★★★
()

> пропускает не нужные числа

Какие к примеру? Как ты определяешь ненужность числа?

rival ★★
()

Какая вообще задача? Может тебе и вовсе не нужно вырезать дату из произвольной строки.

rival ★★
()
Ответ на: комментарий от rival

мне необходимо вырезать дату 10/10/2011 или может быть 10/12 такого формата, т.е. когда код указывается и когда не указывается

vkg2
() автор топика

Для этого есть datetime.strptime.

provaton ★★★★★
()
Ответ на: комментарий от vkg2

Ты почти повторил то, что было у тебя в оригинальном посту. То есть так и не ответил на вопросы.

мне необходимо вырезать дату

Зачем?

может быть 10/12 такого формата

В твоем регекспе это не учитыватся. Ты это и подразумевал под «пропускает не нужные числа»?

когда код указывается и когда не указывается

Какой код и где (не) указывается?

rival ★★
()
Ответ на: комментарий от rival

очепятка

>> когда код указывается и когда не указывается

Какой код и где (не) указывается?

код => год

shrub ★★★★★
()
Ответ на: комментарий от rival

«Зачем?» для дальнейшей обработки. «В твоем регекспе это не учитыватся. Ты это и подразумевал под „пропускает не нужные числа“?» для начала хотел разобраться с целой датой, поэтому не делал «10/12» «Какой код и где (не) указывается?» очепятка закралась «код» - «год»

p.s. > мне достаточно вырезать часть строки содержащей дату.

vkg2
() автор топика
Ответ на: комментарий от vkg2

> для дальнейшей обработки.
Ты меня либо не понимаешь, либо упорно избегаешь вопроса. Ну и ладно.

Просто предоставь входные данные и что ты хочешь получить.
Например, для суммы цифр это выглядело бы вот так:
123 -> 6
34 -> 7
000 -> 0

rival ★★
()
Ответ на: комментарий от rival

«есть какая то 10 строка содержащая 22 цифры и дату 12/10/2011 и там продолжение 11 чего-то 22» => «12/10/2011»

vkg2
() автор топика
Ответ на: комментарий от vkg2
>>> import re
>>> s = "Let's cut this date 10/10/2011 from string"
>>>
>>> re.sub('([0-2]\d|3[01])\/(0\d|1[012])\/(\d{4})', '', s)
"Let's cut this date  from string"
>>>

Но так делать неправильно.

shrub ★★★★★
()
Ответ на: комментарий от vkg2

Так и знал, что ты обойдешься одним примером, который даже не покрывает твои юзкейсы, описанные ранее («год не указан»).

>>> s = "есть какая то 10 строка содержащая 22 цифры и дату 12/10/2011 и там продолжение 11 чего-то 22"
>>> re.findall("\d{2}/\d{2}/\d{2,4}", s)
['12/10/2011']
>>> re.search("(\d{2}/\d{2}/\d{2,4})", s).groups()
('12/10/2011',)
rival ★★
()
Ответ на: комментарий от vkg2

Как минимум, сначала необходимо проверить является ли датой тот набор символов что подходит под регулярку. 31/02/2012 не является датой, но будет вырезано.

Существует вероятность, что такое решение удовлетворяет условиям твоей задачи которые ты так и не озвучил когда про это интересовались выше.

shrub ★★★★★
()
Ответ на: комментарий от rival

>>> s = "есть какая то 10 строка содержащая 22 цифры и дату 31/02/2011 и там продолжение 11 чего-то 22"
>>> re.findall("\d{2}/\d{2}/\d{2,4}", s)
['31/02/2011']


У тебя тоже не дату находит :)
shrub ★★★★★
()
Ответ на: комментарий от shrub

Ну да, учитывая, что 31 февраля не бывает. Но проще найти все такие псевдодаты, после чего валидировать их, например, с помощью упомянутого выше strptime.

rival ★★
()
Ответ на: комментарий от vkg2

Вырезать, то есть выбросить и забыть?

Тогда как-то так:

# -*- coding: utf-8 -*-
import re
from datetime import datetime

def replace_dates(match):
    dt = match.group(0)
    # Здесь можно сделать несколько проверяемых форматов
    try:
        datetime.strptime(dt, '%d/%m/%Y')
        return ''
    except ValueError:
        return dt

print re.sub(r'[0-9/]+', replace_dates,
    "есть какая то 10 строка содержащая 22 цифры и дату 31/02/2011 и там продолжение 11 чего-то 22")

print re.sub(r'[0-9/]+', replace_dates,
    "есть какая то 10 строка содержащая 22 цифры и дату 28/02/2011 и там продолжение 11 чего-то 22")

baverman ★★★
()

У нас принято такие вопросы в Development задавать. Здесь задачи по ЯП, только если это PHP/JS/JSP.

moscwich
()
Ответ на: комментарий от xpahos

> У нас принято такие вопросы в Development задавать. Здесь задачи по ЯП, только если это PHP/JS/JSP.

Python в web используется, и очень даже, но к моему высказыванию это отношения не имеет.

moscwich
()
Ответ на: комментарий от moscwich

Просто так принято. Почитай списки тредов.

о, как скажешь, повелитель лора :)

xpahos ★★★★★
()

всем спасибо. помогло решение: re.findall(«\d{2}/\d{2}/\d{2,4}», s)

vkg2
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.