2012-04-02 27 views
8

Tôi muốn để phù hợp với số ngày có định dạng sau:ngày kết hợp sử dụng python biểu thức thông thường

2010-08-27, 2010/08/27

Ngay bây giờ tôi không phải là rất cụ thể về ngày thực sự khả thi, nhưng chỉ là nó có định dạng đúng.

hãy nói cụm từ thông dụng cho điều này.

Cảm ơn

+0

Điều này khá cơ bản. Bạn đã thử bất cứ điều gì một mình? –

+2

Bạn chỉ muốn kiểm tra định dạng hoặc chuyển đổi nó? Nếu bạn cũng muốn chuyển đổi, vui lòng xem 'time.strptime' - không cần bất kỳ cụm từ thông dụng nào. –

Trả lời

18

Bạn có thể sử dụng các mô-đun datetime để phân tích ngày:

import datetime 

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

đầu ra:

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' 

Vì vậy, bắt ValueError sẽ cho bạn biết nếu các trận đấu ngày:

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

Để cho phép cho các định dạng khác nhau mà bạn có thể một trong hai bài kiểm tra đối với tất cả khả năng, hoặc sử dụng re để phân tích ra các lĩnh vực đầu tiên:

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

tôi muốn khớp các ngày mẫu DD/MM/YYYY, DD-MM-YYYY bằng cách sử dụng Cụm từ thông dụng và thay thế các chuỗi như vậy bằng chuỗi 'DATE'. Sử dụng python – user1308308

+0

Bạn cũng có thể kiểm tra lại tất cả các biến thể có thể có trong hàm của bạn hoặc trích xuất các chữ số bằng cụm từ thông dụng. Tôi sẽ cập nhật câu trả lời. – hochl

2

Sử dụng các module datetime. Dưới đây là một regex vì lợi ích của kiến ​​thức mặc dù bạn không nên sử dụng nó:

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

Bạn có thể sử dụng mã này:

import re 

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

cập nhật biểu thức chính quy dưới đây:

# 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

Cảm ơn rất nhiều – user1308308

+0

ok, tôi nghĩ câu trả lời của hochl là tốt nhất vì nó sử dụng 'datetime' có thể xác thực ngày tháng. Sau đó, nếu bạn muốn sử dụng cụm từ thông dụng để thực hiện việc này, tốt hơn nên sử dụng điều này bởi jamylak: '" \ d {4} [- /] \ d {2} [- /] \ d {2} " vì nó cũng kiểm tra độ dài của chuỗi năm là 4 ký tự và ngày và tháng chính xác là 2 ký tự. :) –

+0

xin vui lòng cho tôi biết làm thế nào để thay thế mô hình mới trong chuỗi phù hợp – user1308308

Các vấn đề liên quan