2009-07-20 34 views
8

Thông thường, tôi muốn xây dựng các regexps phức tạp từ những cái đơn giản hơn. Cách duy nhất mà tôi hiện đang nhận thức để làm điều này là thông qua các hoạt động chuỗi, ví dụ .:Regexp Composable trong Python

Year = r'[12]\d{3}' 
Month = r'Jan|Feb|Mar' 
Day = r'\d{2}' 
HourMins = r'\d{2}:\d{2}' 

Date = r'%s %s, %s, %s' % (Month, Day, Year, HourMins) 
DateR = re.compile(Date) 

Có ai biết về một phương pháp khác hoặc một cách tiếp cận có hệ thống hơn (có thể là một mô-đun) trong Python có regexps composable? Tôi muốn biên dịch từng regexp riêng lẻ (ví dụ: để sử dụng các tùy chọn biên dịch riêng lẻ), nhưng sau đó dường như không còn cách nào để tạo chúng nữa !?

+0

Cách bạn đang làm dường như rõ ràng và súc tích. Oh, nhân tiện, bạn không cần "r" trong chuỗi cho biến 'Date' của bạn. –

+0

Python có cho phép nhận xét trong regex không? –

+1

mmyers, vâng. Khi bạn sử dụng cờ re.VERBOSE thì bạn có thể sử dụng # để nhận xét. –

Trả lời

1

Bạn có thể sử dụng Ping của rxb:

year = member("1", "2") + digit*3 
month = either("Jan", "Feb", "Mar") 
day = digit*2 
hour_mins = digit*2 + ":" + digit*2 

date = month + " " + day + ", " + year + ", " + hour_mins 

Sau đó, bạn có thể đối sánh trực tiếp vào ngày kết quả hoặc sử dụng

DateR = date.compile() 
+0

Điều đó có vẻ như câu trả lời tôi đang tìm kiếm, cảm ơn. Tôi sẽ phải kiểm tra như thế nào các mô-đun đi về tùy chọn biên dịch và các nhóm phù hợp, nhưng từ cái nhìn đầu tiên nó trông perferct :-). – ThomasH

4

Bạn có thể sử dụng cú pháp định dạng của Python cho việc này:

types = { 
    "year":   r'[12]\d{3}', 
    "month":  r'(Jan|Feb|Mar)', 
    "day":   r'\d{2}', 
    "hourmins": r'\d{2}:\d{2}', 
} 
import re 
Date = r'%(month)s %(day)s, %(year)s, %(hourmins)s' % types 
DateR = re.compile(Date) 

(. Lưu ý thêm nhóm xung quanh Jan | Tháng Hai | Mar)

+0

Điều đó vẫn dựa vào các hoạt động chuỗi, đúng không ?! – ThomasH

+1

Yep !? (/ * đệm để làm việc xung quanh hệ thống bình luận câm * /) –