9

I'm using pymongo and want to do a search for items starting with a certain sequence of characters. I might implement that like this:

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

This should work, but what if text is a variable? I could do something like:

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

But now if the text in variable contains any characters with special regex meaning (such as $), the query no longer behaves as expected. Is there a way to do some sort of parameter binding? Do I have to sanitize variable myself? Is that even reliably possible?

Thanks!

Sam
  • 259
  • 2
  • 13

2 Answers2

13

You have to assemble the regex programmatically. So either:

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

OR

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

Note that the code uses re.escape to escape the string in case it contains special characters.

JohnnyHK
  • 305,182
  • 66
  • 621
  • 471
  • I see you edited your post at the same time as I submitted my answer. Looks like we both came to the same conclusion: use the `re` module. Thanks! – Sam Nov 05 '12 at 01:50
-3

Here is the concept: you have to use regex

items = collection.find({
     'key' : {
         $regex : yourRegex
     }
})
Salvador Dali
  • 214,103
  • 147
  • 703
  • 753