2012-04-02 19 views
8

Chcę dopasować dat, które mają następujący format:daty mecz przy użyciu Python wyrażeń regularnych

2010-08-27, 2010/08/27

Teraz nie jestem bardzo szczególności o dacie Jest to możliwe, ale tylko w poprawnym formacie.

proszę podać wyrażenie regularne dla tego.

Dzięki

+0

To jest dość proste. Czy próbowałeś samemu czegoś? –

+2

Czy chcesz tylko sprawdzić format lub przekonwertować go? Jeśli chcesz również konwersji, spójrz na "time.strptime" - który nie potrzebuje żadnego wyrażenia regularnego. –

Odpowiedz

18

można użyć modułu datetime do analizowania dat:

import datetime 

print datetime.datetime.strptime('2010-08-27', '%Y-%m-%d') 
print datetime.datetime.strptime('2010-15-27', '%Y-%m-%d') 

wyjściowa:

2010-08-27 00:00:00 
Traceback (most recent call last): 
    File "./x.py", line 6, in <module> 
    print datetime.datetime.strptime('2010-15-27', '%Y-%m-%d') 
    File "/usr/lib/python2.7/_strptime.py", line 325, in _strptime 
    (data_string, format)) 
ValueError: time data '2010-15-27' does not match format '%Y-%m-%d' 

Więc wzrok ValueError powie, jeżeli data meczu:

def valid_date(datestring): 
    try: 
     datetime.datetime.strptime(datestring, '%Y-%m-%d') 
     return True 
    except ValueError: 
     return False 

celu umożliwienia różnych formatach może albo test dla wszystkich możliwości lub użyj re do analizowania z pól pierwszy:

import datetime 
import re 

def valid_date(datestring): 
     try: 
       mat=re.match('(\d{2})[/.-](\d{2})[/.-](\d{4})$', datestring) 
       if mat is not None: 
         datetime.datetime(*(map(int, mat.groups()[-1::-1]))) 
         return True 
     except ValueError: 
       pass 
     return False 
+0

Chcę dopasować daty wzorca DD/MM/RRRR, DD-MM-RRRR za pomocą wyrażenia regularnego i zastąpić takie ciągi ciągiem "DATA". za pomocą python – user1308308

+0

Dobrze, możesz po prostu przetestować ponownie wszystkie możliwe warianty funkcji lub wyodrębnić cyfry za pomocą wyrażenia regularnego. Zaktualizuję odpowiedź. – hochl

2

pomocą modułu datetime. Tutaj jest regex dla dobra znajomość chociaż nie należy go używać:

r'\d{4}[-/]\d{2}[-/]\d{2}' 
11

Można użyć tego kodu:

import re 

# regular expression to match dates in format: 2010-08-27 and 2010/08/27 
# date_reg_exp = re.compile('(\d+[-/]\d+[-/]\d+)') 

zaktualizowane wyrażenie regularne poniżej:

# regular expression to match dates in format: 2010-08-27 and 2010/08/27 
# and with mixed separators 2010/08-27 
# date_reg_exp = re.compile('\d{4}[-/]\d{2}[-/]\d{2}') 

# if separators should not be mixed use backreference: 
date_reg_exp = re.compile('\d{4}(?P<sep>[-/])\d{2}(?P=sep)\d{2}') 

# a string to test the regular expression above 
test_str= """ 
    fsf2010/08/27sdfsdfsd 
    dsf sfds f2010/08/26 fsdf 
    asdsds 2009-02-02 afdf 
    """ 
# finds all the matches of the regular expression and 
# returns a list containing them 
matches_list=date_reg_exp.findall(test_str) 

# iterates the matching list and prints all the matches 
for match in matches_list: 
    print match 
+0

Bardzo dziękuję – user1308308

+0

OK, myślę, że odpowiedź hochl jest najlepsza, ponieważ używa 'datetime', która może potwierdzić datę. Jeśli chcesz użyć do tego celu wyrażenia regularnego, lepiej użyć tego dostarczonego przez jamylak: '" \ d {4} [- /] \ d {2} [- /] \ d {2} "' ponieważ sprawdza również, czy długość ciągu roku wynosi 4 znaki, a dzień i miesiąc to dokładnie 2 znaki. :) –

+0

proszę mi powiedzieć, jak zastąpić nowy wzór w pasujące ciągi znaków – user1308308

Powiązane problemy