2009-03-03 38 views
13

Có cách nào để gỡ lỗi cụm từ thông dụng trong Python không? Và tôi không đề cập đến quá trình cố gắng và cố gắng cho đến khi họ làm việc :)Làm thế nào tôi có thể gỡ lỗi một biểu thức chính quy trong python?

EDIT: đây là cách regexes có thể được sửa lỗi trong perl:


use re 'debug'; 

my $str = "GET http://some-site.com HTTP/1.1"; 
if($str =~/get\s+(\S+)/i) { 
    print "MATCH:$1\n"; 
} 

Đoạn mã trên sẽ cho kết quả sau trên của tôi máy tính khi chạy:


Compiling REx "get\s+(\S+)" 
Final program: 
    1: EXACTF (3) 
    3: PLUS (5) 
    4: SPACE (0) 
    5: OPEN1 (7) 
    7: PLUS (9) 
    8:  NSPACE (0) 
    9: CLOSE1 (11) 
    11: END (0) 
stclass EXACTF minlen 5 
Matching REx "get\s+(\S+)" against "GET http://some-site.com HTTP/1.1" 
Matching stclass EXACTF against "GET http://some-site.com HTTP/1.1" (33 chars) 
    0   | 1:EXACTF (3) 
    3  | 3:PLUS(5) 
            SPACE can match 1 times out of 2147483647... 
    4  | 5: OPEN1(7) 
    4  | 7: PLUS(9) 
            NSPACE can match 20 times out of 2147483647... 
    24  | 9: CLOSE1(11) 
    24  | 11: END(0) 
Match successful! 
MATCH:http://some-site.com 
Freeing REx: "get\s+(\S+)" 

+0

Nghiêm túc: cung cấp SO dữ liệu mẫu regex của bạn? – annakata

+0

Nếu không có mã mẫu, tất cả những gì chúng tôi có thể làm là đoán xem vấn đề của bạn là gì. –

+3

Tôi hiện không có vấn đề về regex. Tôi chỉ muốn biết cách thực hiện gỡ lỗi. – Geo

Trả lời

17
 

>>> p = re.compile('.*', re.DEBUG) 
max_repeat 0 65535 
    any None 
>>>       
 

regex '|' operator vs separate runs for each sub-expression

+7

Đó chỉ là một nửa câu trả lời, nó cho thấy những gì regexp biên dịch, nhưng không cho thấy nó được thực thi như thế nào một chuỗi đã cho. Nếu có ai biết nửa kia, hãy chia sẻ! – Nickolay

1

Tại sao bạn không sử dụng một số công cụ regex (i thường sử dụng Regulator) và kiểm tra các regex thể hiện ở đó và khi bạn đã hài lòng, chỉ cần sao chép/dán nó vào mã của bạn.

+0

Bởi vì sử dụng một công cụ regex sẽ không cho tôi biết lý do tại sao regex của tôi không hoạt động. – Geo

+0

@Geo - ý của bạn chính xác là "không hoạt động". Không hoạt động chút nào, không phù hợp với những điều bạn muốn phù hợp hoặc ...? – Rook

+1

Có nguy cơ nói rõ ràng, một công cụ regex không thể cho bạn biết tại sao nó không cho bạn kết quả phù hợp. Một regex sẽ làm chính xác những gì bạn nói với nó, và tốt nhất bất kỳ công cụ có thể làm là bước bạn qua để bạn có thể tìm ra chính mình mà bit là sai. – Noldorin

-1

Không chắc chắn về việc thực hiện một điều như vậy trực tiếp bằng Python, nhưng tôi chắc chắn có thể đề xuất sử dụng công cụ chỉnh sửa RegEx. Đó có thể là đặt cược tốt nhất của bạn. Cá nhân, tôi đã sử dụng The Regulator và thấy nó rất hữu ích. Một số khác được liệt kê trong this SO thread.

-1

tôi khá thường xuyên sử dụng RegexPal để kiểm tra nhanh (một biểu thức chính quy prototyper trực tuyến) là. Nó có rất nhiều các biểu thức chung được liệt kê cùng với một biểu thức đơn giản. Rất tiện dụng khi bạn không có một công cụ chuyên dụng và chỉ cần một cách nhanh chóng để tạo ra một regex phong phú.

+0

Tại sao bỏ phiếu xuống? –

0

Những gì RegexBuddy có mà các công cụ khác không có là một built-in debugger cho bạn thấy toàn bộ quá trình khớp của cả hai nỗ lực kết hợp thành công và thất bại. Các công cụ khác chỉ hiển thị kết quả cuối cùng (mà RegexBuddy cũng có thể hiển thị).

1

https://www.debuggex.com cũng khá tốt. Nó là một trình gỡ rối Python trực tuyến (và một vài ngôn ngữ khác), có trình hiển thị khá rõ ràng về những gì và những gì không phù hợp. Một tài nguyên khá tốt nếu bạn cần soạn thảo một regexp nhanh chóng.

+2

Ôi trời, đó là câu trả lời hay nhất ở phía dưới cùng, tôi rất vui khi được đào ở đây.Đó là một công cụ tuyệt vời, nó hoàn toàn miễn phí, trực tuyến (không cài đặt, không phụ thuộc vào hệ điều hành) và nó giải quyết được vấn đề của tôi (một lỗi đánh máy ngu ngốc) thay vì}) trong nháy mắt! Cảm ơn! – Davide

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