2016-10-19 4 views

ответ

8

Есть все виды способов сделать это, вот несколько вариантов:

  • dateutil parser в «нечеткой "режим работы:

    In [1]: s = 'years since 1250-01-01 0:0:0' 
    
    In [2]: from dateutil.parser import parse 
    
    In [3]: parse(s, fuzzy=True).year # resulting year would be an integer 
    Out[3]: 1250 
    
  • регулярные выражения с группы запись:

    In [2]: import re 
    
    In [3]: re.search(r"years since (\d{4})", s).group(1) 
    Out[3]: '1250' 
    
  • Расщепление «так как», а затем через тир:

    In [2]: s.split("since", 1)[1].split("-", 1)[0].strip() 
    Out[2]: '1250' 
    
  • или может быть даже расщепление первого тиром и нарезкой первой подстроки:

    In [2]: s.split("-", 1)[0][-4:] 
    Out[2]: '1250' 
    

Последние две части включают в себя более «движущиеся части» и, возможно, в зависимости от возможных вариантов входной строки.

+1

Не знал о «нечеткой». Ухоженная. – wim

+1

Аккуратно! Я тоже не знал об этом. – idjaw

3

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

  • 4 цифры и захват (\d{4})

  • дефис -

  • две цифры \d{2}

  • дефис -

  • две цифры\d{2}

Отдает: (\d{4})-\d{2}-\d{2}

Демо:

>>> import re 
>>> d = re.findall('(\d{4})-\d{2}-\d{2}', 'years since 1250-01-01 0:0:0') 
>>> d 
['1250'] 
>>> d[0] 
'1250' 

, если вам это нужно, как межд, просто бросить ее как таковую:

>>> int(d[0]) 
1250 
+0

Вам не нужно \ s в начале. – kame

+0

@kame Спасибо. Ты прав. Ред. – idjaw

2

Следующая регулярное выражение должно сделать четырехзначный год, доступный в качестве первой группы захвата:

^.*\(d{4})-\d{2}-\d{2}.*$