2013-02-18 22 views
8

Điều này được viết bằng Python,Biểu thức chính quy của Python được hiển thị lại, tại sao mã này không hoạt động?

import re 
s='1 89059809102/30589533 IronMan 30 Santa Ana Massage table/IronMan 30 Santa Ana Massage table' 
pattern='\s(\d{11})/(\d{8})' 
re.match(pattern,s) 

nó sẽ trả về không.

Tôi cố gắng lấy dấu ngoặc tắt,

pattern='\s\d{11}/\d{8}' 

Nó vẫn trả none.

Câu hỏi của tôi là:

  1. Tại sao re.match không tìm thấy bất cứ điều gì?
  2. Sự khác biệt có hoặc không có khung trong mẫu là gì?
+0

@nhahtdh: ' \ s' và '\ d' không có ý nghĩa trong các chuỗi python bình thường, vì vậy trong trường hợp cụ thể này không có sự khác biệt và các dấu gạch chéo ngược không yêu cầu thoát. –

+0

@MartijnPieters: Bạn nói đúng, nhưng chuỗi thô vẫn còn khá hữu ích để xóa sự nhầm lẫn. Ngôn ngữ khác nhau có cách xử lý khác nhau cho '' \ '' theo sau bởi một ký tự không tạo thành một chuỗi thoát. – nhahtdh

+1

@nhahtdh: Tôi hoàn toàn đồng ý; sử dụng các chuỗi thô 'r''' cho các cụm từ thông dụng chắc chắn là một ý tưởng tuyệt vời và là phương pháp hay nhất. Chỉ trong trường hợp này OP là may mắn và không có sự khác biệt. :-) –

Trả lời

18

"phù hợp" từ đầu chuỗi, nhưng có thêm 1. Thay vào đó, hãy sử dụng re.search để "tìm kiếm" ở bất kỳ đâu trong chuỗi. Và, trong trường hợp của bạn, cũng tìm thấy một cái gì đó:

>>> re.search(pattern,s).groups() 
('89059809102', '30589533') 

Nếu bạn loại bỏ các dấu ngoặc trong mô hình, nó vẫn sẽ trả về một giá trị _sre.SRE_Match, đối tượng, nhưng với trống groups:

>>> re.search('\s\d{11}/\d{8}',s).groups() 
() 
+1

Đó là một lời giải thích rõ ràng. Tôi hiểu ý của bạn, cảm ơn! – bing

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