2011-01-17 15 views

Odpowiedz

33

Można szukać cyfr oddzielonych forward-ukośniki:

In [146]: import re 
In [152]: match=re.search(r'(\d+/\d+/\d+)','The date is 11/12/98') 

In [153]: match.group(1) 
Out[153]: '11/12/98' 

Oczywiście nieprawidłowe daty będzie również zgodne:

In [154]: match=re.search(r'(\d+/\d+/\d+)','The date is 99/99/99') 

In [155]: match.group(1) 
Out[155]: '99/99/99' 

Można potwierdzić datę używając strptime (patrz niżej).


Zamiast wyrażenia regularnego, można analizować go w datetime.datetime obiektu, który jest prawdopodobnie bardziej przydatne:

In [140]: datetime.datetime.strptime("11/12/98","%m/%d/%y") 
Out[140]: datetime.datetime(1998, 11, 12, 0, 0) 

In [141]: datetime.datetime.strptime("11/12/98","%d/%m/%y") 
Out[141]: datetime.datetime(1998, 12, 11, 0, 0) 

In [143]: date.year 
Out[143]: 1998 

In [144]: date.month 
Out[144]: 11 

In [145]: date.day 
Out[145]: 12 

aby sprawdzić, czy ciąg cyfr oddzielonych forward-ukośniki reprezentuje poprawną datę , możesz użyć bloku try..except. Nieprawidłowe daty podniesie ValueError:

In [159]: try: 
    .....:  datetime.datetime.strptime("99/99/99","%m/%d/%y") 
    .....: except ValueError as err: 
    .....:  print(err) 
    .....:  
    .....:  
time data '99/99/99' does not match format '%m/%d/%y' 
+0

Przepraszam, mój błąd, przetestowałem go na 4 cyfry :) – Bronek

1

znajdę poniżej RE działa dobrze na datę w następującym formacie;

  1. 14-11-2017
  2. 14.11.2017
  3. 14 | 11 | 2017

To może zaakceptować lat od 2000-2099

Proszę nie zapomnieć dodać $ na końcu, jeśli nie, to 14-11-201 lub 20177

date="13-11-2017" 

x=re.search("^([1-9] |1[0-9]| 2[0-9]|3[0-1])(.|-)([1-9] |1[0-2])(.|-|)20[0-9][0-9]$",date) 

x.group() 

wyjście = '13 -11-2017 '