2012-11-05 11 views
6

Używam pymongo i chcę wyszukać przedmioty zaczynające się od określonej sekwencji znaków. Mogę realizować to tak:MongoDB/PyMongo: jak "uciec" parametry w wyszukiwaniu regex?

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

To powinno działać, ale co jeśli text jest zmienna? mógłby zrobić coś takiego:

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

Ale teraz, jeśli tekst w variable zawiera żadnych znaków o specjalnym znaczeniu regex (takich jak $), zapytanie nie zachowuje się zgodnie z oczekiwaniami. Czy istnieje sposób na wykonanie jakiegoś wiązania parametrów? Czy muszę osobiście odkażać variable? Czy to jest nawet niezawodnie możliwe?

Dzięki!

Odpowiedz

7

Konieczne jest programowe złożenie wyrażeń regularnych. Więc albo:

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

LUB

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

Należy pamiętać, że kod wykorzystuje re.escape uciec ciąg w przypadku, gdy zawiera znaki specjalne.

+0

Widzę edytować swój post w tym samym czasie, jak złożyłam moją odpowiedź. Wygląda na to, że obaj doszliśmy do tego samego wniosku: użyj modułu 're'. Dzięki! – Sam

-1

Oto pomysł: trzeba użyć regex

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