web-dev-qa-db-fra.com

Jinja2 Split string par des espaces blancs

J'utilise le moteur de modèle Jinja2 (+ pelican).

J'ai une chaîne disant "un 1", et je cherche un moyen de diviser cette chaîne en deux en utilisant l'espace blanc comme délimiteur.

Donc, le résultat final que je recherche est une variable qui contient les deux valeurs sous la forme d'un tableau. par exemple. str [0] est évalué à "a" & str [1] est évalué à "1".

Merci d'avance.

16
elad.chen

J'ai eu le même problème et je n'ai rien trouvé d'utile, alors je viens de créer un filtre personnalisé:

def split_space(string):
    return string.strip().split()

Ajouté à la liste de filtres (avec flacon):

app = Flask(__name__)

def split_space(string):
    return string.strip().split()

#some code here

if __name__ == '__main__':

    app.jinja_env.filters['split_space'] = split_space
    app.run()

Et je l'ai utilisé comme tel dans le modèle:

{% if "string" in element|split_space %} ... {% endif %}
16
Loïc

L'appel de split sur la chaîne devrait faire l'affaire:

"a 1".split()
25
Jakub Kotowski

ma solution est testée dans iPython

In [1]: from jinja2 import Template
In [2]: Template("{{s.split('-')}}").render(s='a-bad-string')
Out[2]: u"['a', 'bad', 'string']"
3
dragon

Je suggère d'utiliser quelque chose comme:

str = "a 1 b 2 c 3"
val = atr.split()

De plus, si vous souhaitez pointer une position spécifique, vous pouvez utiliser quelque chose comme:

val1 = atr.split()[2]

Cela mettra la deuxième valeur dans val1.

2
User2403

J'ai fait un petit plugin qui fait la même chose que la réponse de Loïc mais en spécifiant éventuellement un séparateur. https://github.com/timraasveld/ansible-string-split-filter

Il vous permet de taper:

# my_variable = 'a 1`
{ my_variable | split | join(' and ') } #=> a and 1
2
Tim Raasveld

Vous pouvez également le faire avec un décorateur:

from flask import Flask
app = Flask(__name__)

@app.template_filter('split_space')
def split_space_filter(s):
    return s.strip().split()

if __name__ == '__main__':
    app.run()
0
Jeremy Jones