2012-10-09 7 views
20

Jestem nowy w Jinja2 i do tej pory udało mi się zrobić większość tego, co chcę. Jednak potrzebuję użyć wyrażeń regularnych i nie mogę znaleźć niczego nigdzie w the documentation lub w Googles.Jak używać wyrażeń regularnych w Jinja2?

Chciałbym stworzyć makro, które naśladuje zachowanie to w JavaScript:

function myFunc(str) { 
    return str.replace(/someregexhere/, '').replace(' ', '_'); 
} 

który usunie znaków w ciągu, a następnie zastąpić spacje podkreślenia. Jak mogę to zrobić z Jinja2?

Odpowiedz

26

Istnieje już istniejący filtr o nazwie replace, którego można użyć, jeśli rzeczywiście nie potrzebujesz wyrażenia regularnego. W przeciwnym razie, można zarejestrować custom filter:

{# Replace method #} 
{{my_str|replace("some text", "")|replace(" ", "_")}} 

 

# Custom filter method 
def regex_replace(s, find, replace): 
    """A non-optimal implementation of a regex filter""" 
    return re.sub(find, replace, s) 

jinja_environment.filters['regex_replace'] = regex_replace 
+7

tak to jest droga i skończyło się, niestety. jest głupie, nie możesz używać regex w jinja2 – Jason

+1

hej, stary! Mówisz, że to nieoptymalna implementacja, czy mógłbyś opracować coś, co wyglądałoby jak optymalne? – elias

+2

@elias - ponieważ 'find' jest kompilowany za każdym razem, gdy jest używany przez' re.sub', jeśli był używany jako filtr w dużej pętli, mógł * potencjalnie * być wąskim gardłem. Gdyby tak było, mógłbyś dodać słowo kluczowe arg do filtra ('cache') i skompilować i zapisać argument' find', gdy 'cache' został ustawiony na 'True' - lub możesz po prostu skompilować i cacheować wszystkie' find' argumenty i wybierz strategię odrzucania, która najlepiej pasuje do Twojej aplikacji. –