2012-11-05 7 views
6

Tôi đang sử dụng pymongo và muốn thực hiện tìm kiếm các mục bắt đầu bằng một chuỗi ký tự nhất định. Tôi có thể thực hiện điều đó như sau:MongoDB/PyMongo: làm thế nào để 'thoát' tham số trong tìm kiếm regex?

items = collection.find({ 'key': '/^text/' }) 

Điều này sẽ hiệu quả, nhưng nếu text là biến? Tôi có thể làm một cái gì đó như:

items = collection.find({ 'key': '/^' + variable + '/' }) 

Nhưng bây giờ nếu văn bản trong variable chứa bất kỳ ký tự với ý nghĩa regex đặc biệt (chẳng hạn như $), truy vấn không còn cư xử như mong đợi. Có cách nào để thực hiện một số loại ràng buộc tham số không? Tôi có phải tự vệ sinh variable không? Điều đó thậm chí có thể tin cậy không?

Cảm ơn!

Trả lời

7

Bạn phải lắp ráp regex theo chương trình. Vì vậy, một trong hai:

import re 
regex = re.compile('^' + re.escape(variable)) 
items = collection.find({ 'key': regex }) 

HOẶC

items = collection.find({'key': { '$regex': '^' + re.escape(variable) }}) 

Lưu ý rằng mã sử dụng re.escape để thoát khỏi chuỗi trong trường hợp nó chứa các ký tự đặc biệt.

+0

Tôi thấy bạn thay đổi nội dung bài viết của bạn cùng một lúc như tôi gửi câu trả lời của tôi. Có vẻ như cả hai chúng tôi đều đi đến cùng một kết luận: sử dụng mô đun 're'. Cảm ơn! – Sam

-1

Đây là khái niệm: bạn phải sử dụng regex

items = collection.find({ 
    'key' : { 
     $regex : yourRegex 
    } 
})