LINUX.ORG.RU

Задачка Python3

 


0

2

Пацаны, помогите начинающему питонщику...

Есть каталог в который валятся файлы из разных источников с произвольными именами. Например:

payment_0113_10032015_msk.txt
order-spb-canceled-2210.rtf
заявка берлин сентябрь №9043.txt
01_2014-02-15_113_2451.csv
45f2m56Qfd_1122_000000001.html
и т.п.

Каким образом можно получить из них последовательность цифр фиксированной длинны отделённую каким-либо из разделителей, в данном случае:

0113
2210
9043
2451
1122
?



Последнее исправление: Hokum_new (всего исправлений: 2)

ну смотри по расширению и там уже получай что нужною не?

ggrn ★★★★★
()
In [1]: import re

In [2]: re.compile('\d{4}').search('payment_0113_10032015_msk.txt').group()
Out[2]: '0113'

In [3]: re.compile('\d{4}').search('order-spb-canceled-2210.rtf').group()
Out[3]: '2210'

In [4]: re.compile('\d{4}').search('заявка берлин сентябрь №9043.txt').group()
Out[4]: '9043'


хотя можно покрасивее наверное
всю доку по re не прочитал
не правильно, не досмотрел примеры

Debasher ★★★★★
()
Последнее исправление: Debasher (всего исправлений: 1)
Ответ на: комментарий от Debasher
re.compile('(?<=[\W_])\d{4}(?=[\W_])').search('01_2014-02-15_113_2451.csv').group()

вот как-то так можно было бы, но предпоследний пример всё портит
а вообще я только проснулся и написал какую-то фигню =\

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

Да, я вот пытаюсь придумать, как бы такой вариант исключить...

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

Пройдись по файлам, которые всё портят, как в случае с предпоследним и переименуй. Не думаю, что это займёт много времени. Всё-таки лучше, чем пытаться что-то придумать. Сейчас даты надо будет игнорировать, потом ещё что-нибудь.

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

Надо в именах файлов предварительно делать замену "-" на "", и всё.

Virtuos86 ★★★★★
()
strings = ['payment_0113_10032015_msk.txt',
                'order-spb-canceled-2210.rtf',
                'заявка берлин сентябрь №9043.txt',
                '01_2014-02-15_113_2451.csv', 
                '45f2m56Qfd_1122_000000001.html']
import re
r = re.compile(r'\D(\d{4})\D(?!.*\D\d{4}\D)')
[r.search(s).groups()[0] for s in strings]



Не то?

unikoid ★★★
()
import os, re

files = ['payment_0113_10032015_msk.txt',
'order-spb-canceled-2210.rtf',
'заявка берлин сентябрь №9043.txt',
'01_2014-02-15_113_2451.csv',
'45f2m56Qfd_1122_000000001.html']





def extract_and_print(s):
    size = 4;
    name, ext = os.path.splitext(s)
    nums = re.split('[^\d]+', name)
    nums_with_length = filter(lambda s: len(s) == size, nums)
    
    if len(nums_with_length) == 0:
        print('***** Problems with line ' + s);
    else:
        num = nums_with_length[-1] # the last of us
        print("{0} {1}".format(num, s)) 


for s in files: extract_and_print(s)

Результат:

0113 payment_0113_10032015_msk.txt
2210 order-spb-canceled-2210.rtf
9043 заявка берлин сентябрь №9043.txt
2451 01_2014-02-15_113_2451.csv
1122 45f2m56Qfd_1122_000000001.html
anonymous
()
# -*- coding: utf-8 -*-
files = ['payment_0113_10032015_msk.txt',
'order-spb-canceled-2210.rtf',
'заявка берлин сентябрь №9043.txt',
'01_2014-02-15_113_2451.csv',
'45f2m56Qfd_1122_000000001.html']


def digits(s):
    return ''.join([a for a in s if  '0'<=a<='9'])

[digits(a)[:4] for a in files]

ps. фильтрацию на файлы безциферные - сам :)

pps. http://www.oreilly.com/programming/free/functional-programming-python.csp

pps. https://www.packtpub.com/application-development/functional-python-programming

qulinxao ★★☆
()
Последнее исправление: qulinxao (всего исправлений: 1)

Можно строки, похожие на даты заменять чем-то перед самим поиском цифр:

xxxx-xx-xx => {date}
А потом регуляркой, как уже каждый второй посоветовал.

ichi404
()

а если прст цифры как хэши имён ? :)

qulinxao ★★☆
()

Спасибо всем откликнувшимся!

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