2012-05-22 41 views
5

Hi tôi đã viết regex để kiểm tra nơi chuỗi có char như - hoặc. hoặc/hoặc: hoặc AM hoặc PM hoặc không gian. Các follworig regex làm việc cho điều đó nhưng tôi muốn làm cho trường hợp thất bại nếu chuỗi chứa char khác hơn AMP. nhập táiRegex để kiểm tra ngày

Datere = re.compile("[-./\:?AMP ]+") 

FD = { 'Date' : lambda date : bool(re.search(Datere,date)),} 

def Validate(date): 

    for k,v in date.iteritems(): 
     print k,v 
     print FD.get(k)(v) 

Output:

Validate({'Date':'12/12/2010'}) 
Date 12/12/2010 
True 
Validate({'Date':'12/12/2010 12:30 AM'}) 
Date 12/12/2010 
True 

Validate({'Date':'12/12/2010 ZZ'}) 
Date 12/12/2010 
True (Expecting False) 

được sửa đổi: Validate ({ 'ngày': '12.122.010'}) Ngày 12.122.010 False (Mong False)

Làm thế nào có thể i tìm thấy chuỗi có khác hơn là char APM bất kỳ đề nghị. Cảm ơn rất nhiều.

+0

Bạn đang hỏi cách thu thập chuỗi ngày, ngoại trừ 'AM', 'PM'? – XORcist

+0

@ möter Trong ngắn hạn chỉ làm giả định chuỗi là ngày dựa trên -or/hoặc: orAMP hoặc char không gian hiện diện trong chuỗi – Shashi

Trả lời

1

này cung cấp cho một thử:

^[-./\:?AMP \d]*$ 

Những thay đổi về regex của bạn là

  • Nó neo với^và $ có nghĩa là toàn bộ dòng phải phù hợp và không một phần
  • các \ d được thêm vào lớp nhân vật để cho phép các chữ số

Bây giờ, cơ sở đọc regex dạng danh sách các biểu tượng được phép trên 1 dòng

Nếu bạn muốn chuỗi rỗng không phù hợp sau đó thay đổi * để a +

+0

+1 Cảm ơn @buckely công việc regex cho hoàn hảo để bắt char khác hơn AMP nhưng nếu chúng tôi cung cấp Xác thực ({'Ngày': '12122010'}) sẽ không thành công – Shashi

+0

Tại sao nó không thành công? Tôi có thể đọc ngày 1212-20-10 là Năm 1212 ngày 20 tháng 10 có hiệu lực. Đồng ý rằng yyyyddmm là một định dạng lạ nhưng bây giờ bạn có nói rằng chúng tôi không chỉ nên kiểm tra biểu mẫu mà còn kiểm tra xem nội dung có phải là ngày hợp lệ không?Sau đó, câu hỏi sẽ trở thành định dạng nào bạn muốn hỗ trợ. – buckley

+0

@buckley là loại nội dung phụ trong câu hỏi này. Để _validate_ ... – XORcist

1

Bạn có thể sử dụng một biểu thức như thay vì điều này:

^[-0-9./:AMP ]+$ 

^$ neo biểu thức ở đầu và cuối chuỗi, đảm bảo không có gì khác trong đó (ngoại trừ dòng mới tùy chọn sau $).

+0

Chuỗi ngày "hợp lệ" trong regex này sẽ là: '-30/A-MP/2012/12'. – XORcist

+0

+1 @Thanks Qtax công việc regex hoàn hảo để bắt được char khác ngoài AMP nhưng nếu chúng tôi cung cấp Validate ({'Date': '12122010'}) thì nó sẽ thất bại - Shashi – Shashi

+0

@ möter, yeah, even ':: : ', nhưng không ai nói rằng biểu thức này cố gắng xác thực ngày tháng. (; – Qtax

1

Cách bạn tiếp cận điều này là quá ngây thơ để đối phó với đầu vào bị cắt xén như '-30/A-MP/2012/12', '-30/A-MP/20PA12/12'.

Nếu bạn muốn xác nhận ngày của bạn một cách mạnh mẽ, làm thế nào về:

import datetime 
date = '12-12-2012 10:45 AM' 
formats = ("%d-%m-%Y %I:%M %p", "%d/%m/%Y %I:%M %p", ...) 
for fmt in formats: 
    try: 
     valid_date = datetime.datetime.strptime(date, fmt) 
    except ValueError as e: 
     print(e) 

Bạn sẽ phải xác định tất cả các định dạng có thể, nhưng bạn sẽ nhận được đối tượng datetime đầy đủ (hoặc thời gian hoặc ngày các đối tượng, họ làm việc tương tự) và bạn hoàn toàn có thể chắc chắn rằng chúng hợp lệ. Để được giải thích đầy đủ về các thông số định dạng có sẵn: http://docs.python.org/library/time.html#time.strftime

1

Loại phức tạp, nhưng thực hiện thủ thuật.

import re 
Datere = re.compile(""" 
    ^(?:\d\d[-./\:]){2} ## dd_SEP_dd 
    \d{4}\s* ## year may be followed by spaces 
    (?:\d\d[-./\:]\d\d\s+(?:AM|PM))? ## hh_SEP_mm spaces followed by AM/PM and this is optional 
    \s*$""",re.X) 

FD = { 'Date' : lambda date : bool(re.search(Datere,date)),} 

def Validate(date): 

    for k,v in date.iteritems(): 
     print k,v 
     print FD.get(k)(v) 

print Validate({'Date':'12/12/2010'}) 
print Validate({'Date':'12/12/2010 12:30 AM'}) 
print Validate({'Date':'12/12/2010 ZZ'}) 
+0

Theo regex này, 12-20/2011 sẽ có giá trị và 2012-20-12 sẽ không được – XORcist

+0

@ möter, từ OP ví dụ rõ ràng (các) ngày của anh ta sẽ không đổi chỗ ngày/tháng/năm, vì vậy mẫu thứ hai của bạn không phải là tổ chức phát hành, ví dụ đầu tiên chúng ta có thể chụp dấu phân tách, sau đó sử dụng nó trong regex xác thực nếu OP cảm thấy một vấn đề. – tuxuday

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